2014-11-24 47 views
1

我有一个程序通过管道输入标准输入数据; 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;时,程序将直接退出。或者至少它会,如果它发生了......

如果someappsomeapp | myprogram结束,或者被杀害,myprog还活着,出现在ps列表。 什么是正确的方法来检测喂养应用程序死亡/结束/被杀害,并在这种情况下戒烟?

回答

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); 
+0

哦...该死的,我花了这么多年来写了数百个非阻塞的'read()',而不是一个阻塞(RTOS的世界),一旦我写一个阻塞的我完全忘记它的行为。 .. 谢谢。 – 2014-11-24 10:45:28