【发布时间】:2011-11-15 02:52:26
【问题描述】:
以下代码通过管道从其他进程读取消息。所有进程都正确打印出所有消息,但它们将永远不会经过 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 是每个进程的读写端表。
【问题讨论】:
-
不清楚为什么这不是您所期望的行为。代码应该在什么条件下通过
while循环? -
@DavidSchwartz 如果它没有读取任何字节或返回错误。
-
您是否有任何特别的理由期望这些事情发生?如果不是,那为什么要退出while循环呢? (文件描述符是非阻塞的吗?)
-
@DavidSchwartz 每个进程通过管道向随机选择的进程发送 5 条消息。我已经发布了发生写入的代码。
-
再一次,您是否有任何特殊原因希望它不读取任何字节或返回错误?我还没有听到它应该退出
while循环的任何理由。您的代码似乎完全按照它的编码去做,继续从连接中读取,直到出现错误。没有错误发生,所以它一直在读。 (它怎么知道另一个进程不会向它发送消息?)