我有一个程序通过管道输入标准输入数据; 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
列表中。
什么是检测喂食申请死亡/结束/被杀的正确方法,并在这种情况下退出?
答案 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);