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 секунд. Прежде всего, правильно ли я использую select? Во-вторых, хотя это может и не быть блокирующим (в том смысле, что родительский процесс не будет прерван kernelм, не приведет ли он к результату (процесс зависает, пока что-то не будет готово)?

Вы должны закрыть неиспользуемые части трубы как в дочернем, так и в родительском процессе.

После завершения записи fd канала будет закрыт в дочернем процессе, но в родительском объекте он все еще открыт, поэтому ваш select будет терпеливо ждать данных ….