44 管道和 FIFO
管道
管道:一般指的是匿名管道。
创建方式:
- 可以用
pipe()
创建,通过fork()
或者 UNIX 域套接字共享给其他进程。 - 也可以通过
popen()
创建子进程。
popen()
和 system()
有一些差异:
system()
会为调用进程忽略 SIGINT 和 SIGTERM,但是popen()
不会忽略这些信号,因为调用进程没有阻塞等待子进程。popen()
不会阻塞 SIGCHLD。如果阻塞了,那么在对应的pclose()
之前就不能正常接受子进程退出的消息了。但这也有个问题:wait()
可能会接收到popen()
创建的子进程的消息,这样调用pclose()
的时候就会返回 -1 并设置errno
为 ECHLD。popen()
和pclose()
配套。除了关闭文件描述符之外,pclose()
还会回收子进程,所以不能用fclose()
代替pclose()
。