【问题标题】:pipe not readable c管道不可读 c
【发布时间】:2010-11-17 04:07:15
【问题描述】:

我正在编写一些涉及管道的代码。这个想法是我应该有一个无限循环的进程,并在它到来时将数据添加到管道中(我正在通过读取文件来测试它,并在 while 循环中逐行执行)。

如果我将另一个进程(读取管道的进程)设置为睡眠,以便读取整个文件,我没有问题并在输出中获取所有文件。一旦我删除睡眠(所以现在两个进程同时启动,第二个进程从管道中读取信息),我的代码直接进入下面代码的 else 块,我从来没有看到任何实际输出。我做错了什么?

close(pipe[1]);  
sleep(5);

while (1) {

  nbytes = read(pipe[0], buffer, 200);    

  if(errno != EWOULDBLOCK) {      
    printf("%s", buffer);     
  }

  else {
    printf("I am not blocked here\n");
    sleep(1);
  }
} 

谢谢

【问题讨论】:

    标签: c pipe


    【解决方案1】:

    两件事:

    1. 您是否使管道[0] 不阻塞?类似于int nbio=1; ioctl(pipe[0], FIONBIO, &nbio);
    2. 您正在检查错误。
    if(nbytes > 0) {
        /* you may need to null-terminate the input buffer prior to display */
        buffer[nbytes] = '\0';
        printf("%s", buffer);
    }
    else if(errno == EWOULDBLOCK) {
        printf("I am not blocked here\n");
        sleep(1);
    }
    else {
        printf("some other error occurred - if nbytes == 0, then it's EOF.\n");
    }
    

    可能 errno 第一次通过时是 EWOULDBLOCK,然后在成功读取时不会更新,所以它看起来又像 EWOULDBLOCK。

    【讨论】:

    • 我正在使用 ioctl(named_pipeID[0], FIONBIO, NULL);使管道不堵塞。我尝试将处理错误检查的方式更改为您建议的方式,但仍然遇到完全相同的问题。基本上,父进程不断写入管道,子进程不断进入错误块。
    • 是的!问题解决了,我刚刚注意到你的最后两行。我在错误块中设置了 errno = 0。我没有意识到你必须手动清除它。
    • read 将在任何失败时返回 -1,包括 EWOULDBLOCK。它仅在失败时设置errno。因此,适当的行为是首先检查来自read 的返回值,然后仅在read 指示失败时检查errno。请参阅手册页。 HTH
    • 您确实需要检查read 的返回值。单独检查 errno 非常容易出错。
    猜你喜欢
    • 1970-01-01
    • 2018-10-04
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 2013-04-16
    • 2011-07-23
    相关资源
    最近更新 更多