(류광 번역, 고급 유닉스 프로그래밍 제 2판 406p 하단) system함수가 실행 중인 상황에서는 SIGCHID 전달을 차단해야 한다. 실제로도 POSIX.1에 그렇게 명시되어 있다. 그렇게 하지 않으면, system이 생성한 자식 프로세스가 종료되었을 때 system을 호출한 프로세스가 자신의 자식들 중 하나가 종료된 것으로 오인하게 된다. 그 프로세스는 wait류 함수들 중 하나를 사용해서 그 자식 프로세스의 종지 상태를 수거할 것이며, 그러면 system함수가 그 자식 프로세스의 종지 상태(반환 값으로 쓰인다.)를 회수할 수 없게 된다.
system함수가 생성한 자식 프로세스의 종지 상태를 system함수가 회수해야하는 이유가 무엇인지 궁금합니다. 원래 종지 상태는 부모가 회수하는 것이 보통 아닌가요???
A라는 프로세스가 자기 내부에서 system 함수를 부르면 1. fork/exec해서 자식 B를 실행시키고, 2. 다시 wait류 함수를 호출해서 B가 종료할 때까지 대기상태로 들어갈텐데, A에 SIGCHID 핸들러를 등록되어있는 상태였다면 B가 종료되어 SIGCHID가 전달되었을 때 1. A는 대기상태에서 깨어나서 2. 등록된 핸들러를 실행, 여기서 별도의 wait류 함수를 실행시켜 B의 종료값을 받아버리고 핸들러에서 리턴, 다시 대기상태로 들어가겠죠? 그 이후로 A는 system함수 내부에서 불린 wait 내부에서 계속 멍때리고 기다리는거예요
그 문장 어디에서 부모 프로세스가 2개라는 암시를
그 문장 어디에서 부모 프로세스가 2개라는 암시를 받으셨는지요 ?
아...;;;
말하자면 system함수에서 fork함수를 호출해서 생긴 자식 프로세스가 종료되면 system함수로도 시그 차일드 신호가 가고 system함수를 호출한 프로세스에게도 시그 차일드 신호가 간다는 건가요???
system함수가 생성한 자식 프로세스의 부모 프로세스 system함수를 호출한 프로세스가 된다면 system함수를 호출한 프로세스에게만 신호가 가는게 맞지 않나요?? 일개 함수(시스템 콜)에게도 신호가 가는 이유가 뭔가요??
뭔가 잘못생각하고 계신듯 합니다.
system함수는 그냥 함수일뿐입니다. 당연히 system함수에게는 시그널이 전달되지 않습니다.
system함수를 호출한 부모 프로세스에게만 시그널이 보내지겠죠.
그럼 책에 나와 있는 이 내용은 어떻게 이해를 해야할지요...
(류광 번역, 고급 유닉스 프로그래밍 제 2판 406p 하단) system함수가 실행 중인 상황에서는 SIGCHID 전달을 차단해야 한다. 실제로도 POSIX.1에 그렇게 명시되어 있다. 그렇게 하지 않으면, system이 생성한 자식 프로세스가 종료되었을 때 system을 호출한 프로세스가 자신의 자식들 중 하나가 종료된 것으로 오인하게 된다. 그 프로세스는 wait류 함수들 중 하나를 사용해서 그 자식 프로세스의 종지 상태를 수거할 것이며, 그러면 system함수가 그 자식 프로세스의 종지 상태(반환 값으로 쓰인다.)를 회수할 수 없게 된다.
system함수가 생성한 자식 프로세스의 종지 상태를 system함수가 회수해야하는 이유가 무엇인지 궁금합니다. 원래 종지 상태는 부모가 회수하는 것이 보통 아닌가요???
그 system 함수 호출한 프로세스가 부모
그 system 함수 호출한 프로세스가 부모 프로세스라니까요. 둘이 다른 게 아니예요.
A라는 프로세스가 자기 내부에서 system 함수를 부르면 1. fork/exec해서 자식 B를 실행시키고, 2. 다시 wait류 함수를 호출해서 B가 종료할 때까지 대기상태로 들어갈텐데, A에 SIGCHID 핸들러를 등록되어있는 상태였다면 B가 종료되어 SIGCHID가 전달되었을 때 1. A는 대기상태에서 깨어나서 2. 등록된 핸들러를 실행, 여기서 별도의 wait류 함수를 실행시켜 B의 종료값을 받아버리고 핸들러에서 리턴, 다시 대기상태로 들어가겠죠? 그 이후로 A는 system함수 내부에서 불린 wait 내부에서 계속 멍때리고 기다리는거예요
아 그렇군요...^^
답변 감사합니다. 잘 이해되었습니다.
system함수가 어떻게 구현되어있는지는 정확히 모르지만
아마 대략적으로 fork, execl류의 함수를 호출하여 자식 프로세스를 생성 후, 특정 명령어를 수행시킨다음
wait함수를 호출하여 자식프로세스가 종료되기를 기다린 후 리턴하는 형태로 구현되어 있을겁니다.
그런데 만약 system 함수를 호출하기전에 wait 함수를 호출하는 SIGCHLD 핸들러를 등록하고나서 system 함수를
호출하게 된다면, system이 생성한 자식 프로세스가 종료되는 순간 SIGCHLD 시그널이 부모 프로세스에게 전달되고
SIGCHLD 핸들러가 호출되겠죠. 그렇게되면 이 핸들러에서 wait함수가 호출되어 자식 프로세스의 종료상태가 회수
되고, 결국 system 함수 내부에서 호출된 wait은 리턴되지 못하겠죠.
아마 제 생각에는 책의 내용이 이런 문제점에 대해서 말하고 있는 것 같습니다.
그리고 system 함수 내부에서 자식 프로세스의 종료상태를 회수하는 이유는, 아마도 그렇게 하지않으면 결국
사용자가 직접 wait을 호출해야 하는데, 낌빡하고 wait을 호출하지 않을경우 좀비 프로세스가 되어버리기 때문에
이를 방지하기 위해서도 system 함수 내부에서 회수하는 것 같습니다.
답변 감사합니다...^^
많은 도움 되었습니다.
system 함수는 shell 을 통해서 실행됩니다.
system 함수는 shell 을 통해서 실행됩니다.
---------
간디가 말한 우리를 파괴시키는 7가지 요소
첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스
이익추구를 위해서라면..
다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치
댓글 달기