Unix IPC之FIFO
#include "unpipc.h" #define FIFO1 "/tmp/fifo.1" #define FIFO2 "/tmp/fifo.2" // #define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) void client(int, int), server(int, int); int main(int argc, char **argv) { int readfd, writefd; pid_t childpid; /* 4create two FIFOs; OK if they already exist */ if ((mkfifo(FIFO1, FILE_MODE) < 0) && (errno != EEXIST)) err_sys("can't create %s", FIFO1); if ((mkfifo(FIFO2, FILE_MODE) < 0) && (errno != EEXIST)) { unlink(FIFO1); // 由于err_sys中含有exit函数,这里要在退出之前要删除FIFO1 err_sys("can't create %s", FIFO2); } if ( (childpid = Fork()) == 0) /* child */ { readfd = Open(FIFO1, O_RDONLY, 0); // FIFO1 READ writefd = Open(FIFO2, O_WRONLY, 0); // FIFO2 WRITE server(readfd, writefd); exit(0); } /* 4parent */ writefd = Open(FIFO1, O_WRONLY, 0); // FIFO1 WRITE readfd = Open(FIFO2, O_RDONLY, 0); // FIFO2 READ client(readfd, writefd); Waitpid(childpid, NULL, 0); /* wait for child to terminate */ Close(readfd); Close(writefd); Unlink(FIFO1); // 删除管道FIFO1 Unlink(FIFO2); // 删除管道FIFO2 exit(0); } /** * 现在来看一下上面那个程序 * (假设)服务器代码先运行,因此: * 当起运行到readfd = open(FIFO1, O_RDONLY, 0);的时候,还没有任何进程以O_WRONLY方式打开FIFO1,进程阻塞在这里; * * 然后客户端代码开始运行,但运行到这个地方的时候:writefd = open(FIFO1, O_WRONLY, 0); * 服务器阻塞的地方开始释放,而在客户端,因为FIFO1在服务器已经是以O_RDONLY打开了,所以继续运行。 * * 如果客户端的这两个open交换一个顺序 * 那么readfd = open(FIFO2, O_RDONLY, 0);先运行,则由于FIFO2还没有以O_WRONLY方式打开,所以客户端也阻塞,客户和服务器都阻塞 * 大家都在等对方的资源,这种情况我们称之为死锁(deadlock) * * 总结: * writefd = open(FIFO1, O_WRONLY, 0); 这个是用只写方式打开管道, * 如果FIFO1此时已经有别的进程以只读方式打开(就是说在这条代码运行之前,已经有代码open(FIFO1, O_RDONLY, 0)运行), * 则此函数返回成功,否则,将会阻塞到有别的进程以只读方式打开FIFO1为止。反过来也一样。 * */
2015-08-12 14:55:52
程序的目的及函数介绍请参考:http://www.cnblogs.com/fengkang1008/p/4721478.html
这里用FIFO来替代PIPE。