Select()仍然阻止从管道读取

我的应用程序分叉一个孩子,孩子执行一个新的程序,父母写入它,然后在孩子完成一些工作后从孩子读回来。 当监视管道的读取结束时,程序仍然等待孩子。 我目前没有写回父母,所以它故意阻止。 下面是代码(write_to()函数关闭函数中管道的未使用部分):

pid_t leaf_proc; int rv = 0; int w_pfd[2]; int r_pfd[2]; if(pipe(w_pfd) == -1 || pipe(r_pfd) == -1){ printf("Failed to pipe. Goodbye.\n"); exit(0); } if((leaf_proc = fork()) < 0){ printf("Error: %s\n",strerror(errno)); exit(0); }else if(leaf_proc == 0){ /***Child to be execl()'d***/ rv = execl("Some program"); if(rv < 0){ printf("Error: %s\n",strerror(errno)); exit(0); } }else{ /***Parent***/ write_to(par_info,w_pfd); fd_set read_set; //struct timeval tv; //tv.tv_sec = 5; //tv.tv_usec = 0; FD_ZERO(&read_set); FD_SET(r_pfd[0], &read_set); rv = select(r_pfd[0]+1,&read_set,NULL,NULL,&tv); printf("set?: %d\n",rv); } 

运行此程序时,程序仍然会在select语句中挂起(永远不会到达最后一个printf),但如果我添加超时信息,则程序会在5秒后继续。 首先,我正确使用选择吗? 第二,虽然这可能不是阻塞(在某种意义上,父进程不会被内核中断,它是否仍会导致结果(进程挂起,直到某些东西准备好)?

您必须在子进程和父进程中关闭管道的未使用部分。

在终止之后,管道的写入fd将在子进程中关闭,但在父进程中它仍处于打开状态,因此您的select将耐心地等待数据….