2013-09-24 2 views
2

Ниже приводится общийpipe()использование Пример:Необходимо ли закрывать противоположные концы трубы в родительском и дочернем?

int fd[2]; 
pipe(fd); 

if((childpid = fork()) == -1) 
{ 
     perror("fork"); 
     exit(1); 
} 

if(childpid == 0) 
{ 
     /* Child process closes up input side of pipe */ 
     close(fd[0]); 

     ////.....some code....//// 
     exit(0); 
} 
else 
{ 
     /* Parent process closes up output side of pipe */ 
     close(fd[1]); 

     ////.....some code....//// 
} 

То, что я хочу знать, что нужно ли вызовclose(fd[0]) у ребенка и close(fd[1]) в родительском процессе .

Что произойдет, если я неclose() их и использовать только fd[1] в ребенке и fd[0] в родителе.

Закрыто ли это только для того, чтобы мы случайно ничего не делали с этими дескрипторами?

ответ

3

Если у обоих процессов открыты оба конца трубы, то если один из них погибнет, другой будет блокироваться, а не обнаруживать EOF при чтении (потому что все еще есть сам сценарий) или был убит SIGPIPE при записи (потому что есть еще читатель: сам).

Смежные вопросы