2014-11-24 66 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