以下代码通过管道从其他进程读取消息。所有进程都正确打印出所有消息,但它们将永远不会继续经过 while 循环。尝试在 Eclipse 中进行调试,在阅读完所有消息后,它将停止在 while 循环处。
索引是分配给每个进程的编号。第一个进程的索引 == 0。
消息本身只是发送消息的进程的索引。
while((n = read(fd[index][0], &mymsg, sizeof(int))) == sizeof(int))
printf("process%d has received a message from process%d\n", index, mymsg);
有什么想法为什么会发生这种情况吗?
以下是每个进程如何写入另一个进程:
// Write to other process
if(write(fd[index2][1], &index, sizeof(int)) != sizeof(int))
sys_error(2);
如此进行五次。 fd是每个进程的读写端表。
致电给read()
正在阻塞,直到出现更多数据。来自管道的手册页 http://linux.die.net/man/7/pipe
如果进程尝试从空管道中读取数据,则 read(2) 将
阻塞直到数据可用。如果一个进程尝试写入
满管道(见下文),然后 write(2) 阻塞,直到有足够的数据
已从管道中读取以允许写入完成。非阻塞
I/O 可以通过使用 fcntl(2) F_SETFL 操作来启用
O_NONBLOCK 打开文件状态标志。
打开每个文件描述符后,在进入 while 循环之前,对每个文件描述符执行以下操作:
fcntl(fd, F_SETFL, O_NONBLOCK);
但是,您确实应该阅读阻塞 I/O 与非阻塞 I/O 的比较,包括阅读 pipeline、read、fcntl 等的手册页。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)