民意调查如何处理封闭管道

我想知道:

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) 

如果POLLINrevents设置的唯一标志,那将是真的。 也许这就是你认为你想要检查的,但正常的测试将是:

 if(fd[i].revents & POLLIN) 

它将检查POLLIN位是否置位,表示read不会被阻塞。

读取失败后可以检测到错误情况,因此没有必要检查是否设置了POLLHUP 。 在输入套接字上测试POLLHUP并不是一个好主意,因为即使数据可供读取,也可以设置标志,并且通常需要读取数据。

当管道的写入端关闭时, read()poll()的读取端将显示为“可读” – 这是因为read()不会阻塞。

当您调用read() ,返回值将为零,表示文件结束。