[Unix] 데몬 프로세스 만들기
[ CnUnix ] in KIDS
글 쓴 이(By): rockers ()
날 짜 (Date): 2000년 9월 22일 금요일 오후 05시 03분 57초
제 목(Title): 데몬 프로세스 만들기
데몬 프로그램에 대해 공부하는 중인데 stevens책에서는 데몬 프로세스를 만들기 위해서 fork를 두번 하더군요. 꼭 fork를 두번 해야 하는 건지 하구요. 두번째 fork의 의미를 알고 싶어서 글을 올립니다. 고수님들의 글 기다리겠습니다
[ CnUnix ] in KIDS
글 쓴 이(By): prince (박성훈)
날 짜 (Date): 2000년 9월 22일 금요일 오후 06시 14분 31초
제 목(Title): Re: 데몬 프로세스 만들기
아버지를 죽여서 고아를 만들면 좀비가 안되거든요…
—
— prince —
[ CnUnix ] in KIDS
글 쓴 이(By): terzeron (microkid)
날 짜 (Date): 2000년 9월 23일 토요일 오후 02시 24분 57초
제 목(Title): Re: 데몬 프로세스 만들기
제 생각에는 좀비가 되느냐의 문제는 fork를 두 번 하는 것과는 별 상관이 없을 것 같습니다. 그건 signal 콜의 호출 이유일 것이구요…
System V에서만 fork를 두 번 해서 daemon을 만듭니다. daemon은 제어 터미널을 다시 얻지 못해야 하는 조건이 있는데, 그걸 만족시키기 위해서 setpgrp를 호출하여 제어 터미널을 날려버리고 프로세스 그룹 리더가 됩니다. 그런데 프로세스 그룹 리더이면 제어 터미널을 어떤 방식으로든 얻을 수가 생기거든요. 그래서 프로세스 그룹 리더임을 포기하기 위해서 fork해서 생기는 child를 daemon으로 만드는 거죠.
BSD에서는 fork하지 않아도 프로세스 그룹 ID가 0이 아닌 프로세스 그룹 리더인 경우에 제어 터미널을 다시 할당받지 못하도록 하기 때문에 fork가 필요없습니다.
다음은 스티븐스의 책을 우리 말로 옮긴 것입니다. 첫번째 단락이 질문의 답이 되는 거죠.
우리는 위에서 System V가 어떤 프로세스가 프로세스 그룹의 리더일 때만 그 프로세스에게 제어 터미널을 할당한다고 언급했다. setpgrp 콜을 이용해서 우리는 daemon이 프로세스 그룹 리더가 되도록 만들었다. 만약 daemon이 프로세스 그룹 리더가 되는 것을 멈추게 되면 그것은 결코 다시 제어 터미널을 얻을 수 없다. 이렇게 하기 위해서 우리는 daemon이 다시 fork를 하고 부모 프로세스(첫 fork에서 나온 자식 프로세스)가 종료하도록, 또한 자식 프로세스가 계속 진행되도록 한다.
하지만 첫번째 자식 프로세스가 exit를 호출할 때 그것은 hangup 시그널 HANGUP을 야기하고 이것은 exit하는 프로세스의 프로세스 그룹에 속해있는 모든 프로세스에게 보내지게 된다. 이것은 두번째 자식 프로세스가 이 시그널을 받는다는 것을 의미한다. 이것을 피하기 위해서 daemon은 fork를 호출하기 전에 signal을 호출해서 hangup 시그널을 무시하게 된다. (시그널 세팅은
부모 프로세스로부터 자식 프로세스로 fork를 가로질러 복사된다는 것을 상기하라.)