【问题标题】:What is causing my program to hang and not exit properly? (pipe, read system call, while loop)是什么导致我的程序挂起并且无法正常退出? (管道、读取系统调用、while 循环)
【发布时间】:2013-12-03 15:33:41
【问题描述】:

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

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
}

【问题讨论】:

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


    【解决方案1】:

    也许你没有关闭管道?如果写端没有关闭,读会一直挂起

    尝试添加

    close(pfds[j][1]);
    

    在你将你的消息写入管道之后

    【讨论】:

    • 完美。我添加了一个 for 循环来关闭管道的所有写入端。谢谢。
    • 很高兴听到这个消息! :)
    【解决方案2】:

    read(fd)(其中fd 是管道的读取端)只会在管道的所有写入端都已关闭时返回0

    注意fork()-ing 将复制所有打开的文件描述符。所以这个:

    int fd[2];
    pipe(fd);
    if (fork() == 0) {
      write(fd[1], "abc", 3);
      close(fd[1]);
    } else {
      char buf[100];
      while (read(fd[0], buf, 100) > 0) {
        // ...
      }
    }
    

    会导致无限循环(因为fd[1]在父进程中仍然打开),而这个:

    int fd[2];
    pipe(fd);
    if (fork() == 0) {
      write(fd[1], "abc", 3);
      close(fd[1]);
    } else {
      close(fd[1]);
    
      char buf[100];
      while (read(fd[0], buf, 100) > 0) {
        // ...
      }
    }
    

    应该终止。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-18
      • 1970-01-01
      • 2012-11-03
      • 2018-09-12
      • 1970-01-01
      • 2010-12-04
      • 2020-01-11
      相关资源
      最近更新 更多