을 사용하여 약간의 프로그램을 작성하여 pipe
을 사용하여 통신하는 새 프로세스를 작성했습니다. 방어 프로그래밍을 적용하여 모든 반환 값을 확인합니다. 반환 값이 잘못되었다고 나타내면 모든 리소스를 해제하고 모든 파이프와 부모 프로세스를 닫아서 자식 프로세스가 종료 될 때까지 기다려야합니다. 이제 오류가 발생하면 구제 방법은 무엇입니까? 순간 파이프를 다룰 때 돌발을위한 전략
/* initialize pipes */
if(pipe(p1fd) == -1) {
(void) printError("Could not init pipe 1");
exit(EXIT_FAILURE);
}
if(pipe(p2fd) == -1) {
(void) printError("Could not init pipe 2");
(void) close(p1fd[0]);
(void) close(p1fd[1]);
exit(EXIT_FAILURE);
}
switch (pid = fork()) {
case -1:
(void) printError("Could not fork");
(void) close(p1fd[0]);
(void) close(p1fd[1]);
(void) close(p2fd[0]);
(void) close(p2fd[1]);
exit(EXIT_FAILURE);
break;
case 0: /* child process */
break;
default: /* parent process */
break;
}
하나가 더 많은 자원을 필요로하는 경우 이것은 매우 성가신 가져옵니다. 내가 생각한 또 다른 방법은 파이프가 실제로 열렸 으면 돌보지 않고 모든 파이프를 닫는 구제 기능을 제공하는 것입니다 (메모리를 확보하고 하위 프로세스에 wait
을 호출하는 것과 동일). 그러나 파이프의 일부가 다른 하위 프로세스/기능으로 전달되므로 이러한 보석금 상환 기능에 필요한 모든 변수가 전역 적이어야합니다.
'goto'이 당신의 친구입니다. –
@mort :'close()'시스템 호출의 리턴 값을 체크하지 않습니다. exit()가 종료되지 않을 것을 기대하지 마라 .-) –
@Vlad : 음,'exit()'에는 반환 값이 없다. – mort