代码:
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。
有什么想避免这种等待吗?
感谢。
答案 0 :(得分:1)
打开用于写入的管道将阻塞,直到有读者。您可以通过将O_NONBLOCK选项与O_WRONLY一起使用来更改此行为,但这只会意味着当没有读取器时open会立即返回错误。
您可以使用O_RDWR打开文件以避免阻塞,但我非常确定关闭它时管道的内容将被清除。
但是你的例子并不是通常如何使用管道。管道不是某种临时存储器,可以将数据传递给exec的程序;您将它用于进程间通信。例如,父进程写入数据,子进程读取数据。如果你以这种方式使用管道,你同时拥有一个读者和一个作者,只要作者继续写作并且读者继续阅读,就不会有任何障碍。