如何在输入上检测破裂的管道?

时间:2014-11-24 10:34:14

标签: c linux pipe stdin

我有一个程序通过管道输入标准输入数据; someapp | myprogram

我希望read在断管上返回负值;似乎并非如此。主循环看起来像这样:

    int rdsum = 0;
    int rdsize = 0;

    do
    {
        rdsize = read(STDIN_FILENO, buf, BUFSIZE);
        if(rdsize > 0)
        {
            //[operations on the buffer]
            rdsum += rdsize;
        }
        else if(rdsize == 0)
        {
            usleep(100000);
        }
        else return 0;
    }
    while(rdsum < blocksize);

return 0;后,程序直接退出。或者至少它会,如果它发生......

如果someapp中的someapp | myprogram结束或被杀,myprog仍然有效,则会显示在ps列表中。 什么是检测喂食申请死亡/结束/被杀的正确方法,并在这种情况下退出?

1 个答案:

答案 0 :(得分:1)

来自man 2 read

  

成功时,返回读取的字节数(零表示文件结束)

因此,正确的行为是返回rdsize == 0

-1的返回值仅用于错误(如果文件描述符设置为非阻塞,则为errno == EAGAIN),当发生这种情况时,您应该

perror("read"); // print an error message
abort(); // abort the process or do other error handling

像这样:

int rdsum = 0;
int rdsize = 0;

do
{
    rdsize = read(STDIN_FILENO, buf, BUFSIZE);
    if(rdsize > 0)
    {
        //[operations on the buffer]
        rdsum += rdsize;
    }
    else if(rdsize == 0)
    {
        return 0;
    }
    else if (errno == EAGAIN  || errno == EWOULDBLOCK) { // #include <errno.h>
        usleep(100000);
    } else {
        perror("read"); // print an error message
        abort();        // exit and core dump
    }
}
while(rdsum < blocksize);