民意调查如何处理封闭管道
我想知道:
pipe
关闭时,将为管道的文件描述符设置什么状态poll
?
我尝试下面的代码,在子进程关闭所有文件描述符后,轮询只是认为所有文件描述符都可以读取! 是对的吗? 或者我在这段代码中犯了一些错误?
我使用SUSE和gcc。
#include #include #include "../../../myInclude/apue.h"// this is ok #include int main(int argc, char **argv) { int fd1[2]; int fd2[2]; int fd3[2]; pid_t pid; if(pipe(fd1)<0 ||pipe(fd2)<0 ||pipe(fd3) <0) err_sys("pipe error");//this is a error deal function .it will exit the program and print error message. if((pid = fork()) 0) { printf("now I come \n"); int i = 0,n; char line[MAXLINE]; for(; i< 3; i++) { if(fd[i].revents = POLLIN) if ((n =read(fd[i].fd,line,MAXLINE))< 0) err_sys("read error : %d",i); else { line[n] = 0; printf("read from pipe %d : %s\n",i,line); } } } close(fd1[0]); close(fd2[0]); close(fd3[0]); } return 0; }
我想在子进程关闭所有写文件描述符之后,poll会设置revents POLLHUP 。但它只是设置它POLLIN !
我正在读这本书。我知道这是一本旧书。 所以我想知道民意调查现在如何运作? 它是否设置了POLLIN用于封闭管道? 还是仅仅因为Linux? 或者我的代码错了?
您应该始终使用-Wall
选项编译程序(至少)。 那会告诉你这个问题:
if(fd[i].revents = POLLIN)
条件总是为真,因为这是一个赋值,而不是比较,而POLLIN
是非零的。 以下情况也不正确,尽管它更好:
if(fd[i].revents == POLLIN)
如果POLLIN
是revents
设置的唯一标志,那将是真的。 也许这就是你认为你想要检查的,但正常的测试将是:
if(fd[i].revents & POLLIN)
它将检查POLLIN
位是否置位,表示read
不会被阻塞。
读取失败后可以检测到错误情况,因此没有必要检查是否设置了POLLHUP
。 在输入套接字上测试POLLHUP
并不是一个好主意,因为即使数据可供读取,也可以设置标志,并且通常需要读取数据。
当管道的写入端关闭时, read()
和poll()
的读取端将显示为“可读” – 这是因为read()
不会阻塞。
当您调用read()
,返回值将为零,表示文件结束。