系统api-管道和FIFO

📅 2026/8/11 16:18:34
系统api-管道和FIFO
管道没有名字标识决定了只能用于父子进程间的IPC半双工模式intpipe(intfd[2]);fd[0]用于读取fd[1]用于写入上图为父子进程通过两个管道对象实现全双工通信的例子FIFO有名字标识文件系统路径名半双工模式// 默认包含O_CREAT | O_EXCLintmkfifo(constchar*pathname,mode_tmode);使用模式(1). 用mkfifo创建FIFO对象若返回EEXIST再调open打开此已存在FIFO对象(2).mkfifo创建成功后依然用open来打开使用(3).fifo是文件系统对象删除需用unlinkfifo和管道不支持seek操作评价管道和fifo作为早期的机制均谈不上高效。管道一般用于父子进程随进程退出而消费。fifo一般用于非父子进程需调api实现移除。现代化支持高吞吐/大数据量的进程间通信方案是共享内存mmap/shm 信号量/互斥锁终端read/write(1). 终端底层由内核来对其维护终端接收键盘输入将输入信息存储在终端进程的缓冲区每次键入换行时会将一行输入连同换行字符放入缓冲区每次键入CtrlD产生一个EOF特殊字符放入缓冲区(2). 对终端执行read时终端依据read要求的数据量依次从终端输入缓冲区取出字符最多取要求数量的字符后read返回特殊情况a. 取字符过程中若遇到\n则从输入缓冲区取出此\n且放入read指定缓冲区此字符计入read获取的字符计数中此后read返回b. 取字符过程中若遇到EOF键入CtrlD产生的EOF是输入缓冲区一个字符则EOF从输入缓冲区取出此EOF但不放入read指定缓冲区此字符不计入read获取的字符计数中此后read返回c. 对终端执行write对普通字符显示其字符内容对换行符显示一个换行效果关于EOFa. 对终端EOF也只是在其缓冲区中占据一个字节EOF的特殊作用如上所述但一旦EOF被取出生效缓冲区EOF后仍然可放入正常字符并进行后续处理b. 对文件文件在当前文件位置距离文件结束位置不足要求的读取数据量时一次读完剩余数据并返回后续再次read时就是文件位置已经在结束位置然后继续读的情形此时不论读多少次每次都是以读0字节返回c. 对套接字在缓冲区可读数据余量小于要求量但已经收到FIN时一次读完余量返回套接字只在收到对端的FIN时且缓冲区已经没有可读数据时返回0此后执行一次或多次read每次都是以读取0字节返回