본문 바로가기
프로그래밍

[정보] C++ SIGCHLD, waitpid()에 관해서

by Ohdumak 2021. 11. 26.

안녕하세요. 오두막입니다.

프로세스 종료 및 재구동 등을 테스트하다가 알게된 정보에 대해서 전달드립니다.

부모프로세스에서 자식프로세스를 여러개 만들어서 처리를 하다가 자식프로세스가 종료되면 부모프로세스에 SIGCHLD가 전달됩니다.
그래서 SIGCHLD 시그널을 받고 처리를 하게 되는데, 자식프로세스가 여러개이고 여러 자식프로세스가 동시에 종료가 되면 종료된 수만큼 SIGCHLD가 발생하지 않는걸 알게됐습니다.

검색을 해보니,  SIGCHLD의 경우 여러 번 발생하면 하나로 축소되는 신호이므로 waitpid()를 여러번 수행 필요하다는걸 알게됐습니다. 

그래서 기존에는 한번에 SIGNAL마다 wait()함수를 사용하여 한번씩 처리했지만, 아래 코드와 같이 waitpid() 함수를 사용하여 처리하도록 변경했습니다.

#define MAX_LOOP_COUNT 10
signal_handler (iSig) {
	if (iSig == SIGCHLD) {
        // SIGCHLD의 경우 여러 번 발생하면 하나로 축소되는 신호이므로 waitpid()를 여러번 수행 필요
        // 되도록 무한루프를 사용하지 않도록
        // while (true) {
        for (int i = 0; i < MAX_LOOP_COUNT; i++) {
            // 모든 자식 프로세스의 종료를 기다리며 종료가 있으면 pid, 없으면 리턴 0
            iPid = ::waitpid(-1, &iStatus, WNOHANG);
            if (iPid <= 0) {
                break;
            }
        
            // 종료된 자식프로세스 PID로 프로그램 수행
	}
    } else {
    	// SIGCHLD가 아닌 signal 처리
    }
}
728x90

댓글