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()。