C中的IFIFO文件

时间:2013-12-14 20:46:42

标签: c fork

代码:

            if (P2==0)
            {
               {
                    mknod("file1", S_IFIFO|0666, 0);
                    fd=open("file1", O_WRONLY);
                    write(fd,string2,strlen(string2));
                    close(fd);
                    execl("Ex2","Ex2",NULL);
                    exit(0);
                }
            }

P2是分叉呼叫。

在Ex2文件中,我有以下代码:

            fd=open("file1", O_RDONLY);
            read(fd, string3, 8);
            close(fd);
            printf("\n%d, %s", fd, string3);

我需要从Ex1的P2调用Ex2,Ex2将打印file1 FIFO文件的字符串,但是,当我运行第一个代码时,程序会一直等待调用Ex2,如果我打开另一个终端并调用file1然后,对于猫,Ex1继续,调用Ex2并显示string3。

有什么想避免这种等待吗?

感谢。

1 个答案:

答案 0 :(得分:1)

打开用于写入的管道将阻塞,直到有读者。您可以通过将O_NONBLOCK选项与O_WRONLY一起使用来更改此行为,但这只会意味着当没有读取器时open会立即返回错误。

您可以使用O_RDWR打开文件以避免阻塞,但我非常确定关闭它时管道的内容将被清除。

但是你的例子并不是通常如何使用管道。管道不是某种临时存储器,可以将数据传递给exec的程序;您将它用于进程间通信。例如,父进程写入数据,子进程读取数据。如果你以这种方式使用管道,你同时拥有一个读者和一个作者,只要作者继续写作并且读者继续阅读,就不会有任何障碍。