본문 바로가기

About 배우고 익히는법/펌글

[TCP/IP] signal(SIG_CHLD, SIG_IGN)

Programming/Etc(펌&자료) 2009/07/12 00:36

signal(SIG_CHLD, SIG_IGN)

child 프로세스가 종료되었을 때 zombi가 되는 것을 방지..

[출처] signal(SIG_CHLD, SIG_IGN)|작성자 소룡매냨

-----------------------------------------------------------------------------------------

레뎃 9에서만 뜨는 에러 같긴한데...

ns kernel: application bug: test.d(17445) has SIGCHLD set to SIG_IGN but calls wait()

이 말의 의미는

"SIG_IGN을 SIGCHLD에 설정해놓으면, SIGCHLD 시그널이 올라왔을 때 프로세스에 전달되자 마자 무시하게 되는데, wait을 걸어 두면 모든 자식 프로세스가 죽을 때까지 기다리느라 무한 루프에 빠질 수 있다"

라는 경고입니다.

좀더 자세한 설명은, 리눅스의 구현이 명확하지 않았던 시절에서 만들어졌고,
따라서, 리눅스에서는 SIG_IGN으로 설정하면 모든 자식을 기다린다라고 나름대로 구현하였으나
후에 결정된 표준은 wait를 수행할 경우 SIG_IGN으로 등록되었다할 지라도,
wait을 사용하는 순간 자식 프로세스의 죽음(SIGCHLD)을 IGNORE하지 않는 것인데,
이와 같은 방식으로 동작하지 않을 것이라는 경고입니다.

따라서, SIG_IGN을 쓰려면 wait하지 말고, wait 하려면, SIG_DFL 등으로 설정하라는 것입니다.

음 결국 업데이트 하라는 소리군..!!

HTTP://LinuxQnA.com

by 변익수

출처 : http://iksu.egloos.com/275966

 

-----------------------------------------------------------------------------------------

부모프로세스, 자식프로세스가 종료될 때.....

1. 자식프로세스가 부모프로세스보다 먼저 종료된다.

(a) 만일 부모프로세스가 이미 wait를 수행했다면, wait는 종료된 자식의 프로세스 ID를 가지고 부모프로세스로 돌아간다.

(b) 만일 부모프로세스가 wait를 수행하지 않았다면 자식 프로세스는 좀비프로세스가 된다. 따라서 System V는 다음 문장을 실해아면 자식프로세스가 좀비가 되는 것을 막을 수 있게 해준다.

signal(SIG_CHLD, SIG_IGN)

이것은 부모프로세스가 자식프로세스의 종료 상태에 관심을 가지지 않는다는 것을 커널에 알려준다. 이 시점에서, 커널은 이 프로세스의 자식프로세스들이 좀비가 되지 않도록 한다. 대신에 그들의 종료 상태도 무시된다. 4.3BSD는 이러한 기능을 제공하지 않는다.

출처 : 1992. STEVENS, UNIX NETWORK PROGRAMMING. 한글번역판