sj7*_*755 3 c unix linux ipc process
以下代码通过管道从其他进程读取消息.所有进程都正确地打印出所有消息,但是它们永远不会继续经过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);
Run Code Online (Sandbox Code Playgroud)
有什么想法会发生这种情况吗?
以下是每个进程写入另一个进程的方式:
// Write to other process
if(write(fd[index2][1], &index, sizeof(int)) != sizeof(int))
sys_error(2);
Run Code Online (Sandbox Code Playgroud)
这样做了五次.fd是每个进程的读写结束表.
如果进程尝试从空管道读取,则read(2)将阻塞,直到数据可用.如果进程尝试写入完整管道(见下文),则写入(2)块,直到从管道读取足够的数据以允许写入完成.通过使用fcntl(2)F_SETFL操作来启用O_NONBLOCK打开文件状态标志,可以实现非阻塞I/O.
在输入while循环之前打开每个文件描述符之后,对每个文件描述符执行以下操作:
fcntl(fd, F_SETFL, O_NONBLOCK);
Run Code Online (Sandbox Code Playgroud)
但是,您真的应该阅读阻塞与非阻塞I/O,包括读取管道,读取,fcntl等的手册页.