c - 是什么导致我的程序挂起并且无法正常退出? (管道,读取系统调用,while 循环)

标签 c process system-calls low-level-io

我有一个程序,我从几个子进程写入一个管道,然后尝试从每个管道读取写入每个进程的所有消息,并将它们打印到屏幕上。使用以下代码(具体来说,while 循环使用 read 系统调用将消息存储到缓冲区 buf),我的程序将挂起而不退出,也不会打印所有发送到不同进程的消息。

for (i = 0; i < MAXP; i++) {
    if(id == i) {
        while(read(pfds[i][0], buf, sizeof(buf)) > 0)
             printf("process%d has received a message from %s\n",i,buf);    
    }
}

但是,使用以下代码,程序会正确退出,但不会打印所有消息(因为它们并未全部读取):

for (i = 0; i < MAXP; i++) {
    if(id == i) {
        nbytes = read(pfds[i][0], buf, sizeof(buf));
        printf("process%d has received a message from %s\n",i,buf); 
    }
}

这是我写入管道的代码:

write(pfds[j][1],msg,9);  // write the message to j pipe

消息是:

sprintf(msg, "process%d", i); // create the message - 9 bytes (inc. null term)
// the message is "process0" or "process1" ... through "process8"

这是一个 9 字节的字符数组:

char msg[9];

解决方案

for (j = 0; j < MAXP; j++) {
    close(pfds[j][1]); // close write to j from i
}

最佳答案

也许 b/c 你没有关闭管道?如果write end没有关闭,read会一直挂着

尝试添加

close(pfds[j][1]);

将消息写入管道后

关于c - 是什么导致我的程序挂起并且无法正常退出? (管道,读取系统调用,while 循环),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20082434/

相关文章:

unix - 哪些程序获得控制 tty?

linux - perl sysopen 可以打开文件进行原子写入吗?

ruby - 为什么 ruby​​ 代码在我第二次调用 exec 后崩溃/退出?

mysql - 在C中将mysql数据库查询存储为变量

c - 数组在内存中存储在哪里?

c - 在 C 中重定向子进程的输入和输出

c - Linux block 系统调用

c - Fork() 子链

c - Redis 模块 RESTORE 命令调用

Char * 数组混淆