2010-05-21 4 views
2

우리는 C에서 bash와 같은 쉘을 프로그래밍하고 있지만 백그라운드 프로세스에는 문제가 있습니다. 아버지가 &이 없을 때 아버지가 자식 프로세스를 기다리는 것이므로 기다림이있는 SIGCHLD에 대한 signal_handler를 만들었습니다.백그라운드에서 실행 한 후 좀비 프로세스를 피하는 방법

우리가 피하고 싶은 주된 문제는 signal_handler가 항상 (백그라운드 및 포 그라운드 프로세스로) 실행하기 때문에 signal_handler가 아버지 프로세스 전에 SIGCHLD를 잡으면 아버지의 대기 시간이 아이들이 대기하지 않기 때문에 오류를 리턴합니다.

우리는 전에 실행 한 사람에 따라 다르며, &이 없으면 signal_handler wait는 아버지가 수행하기 전에 아이들을 수집하지 않습니다.

어떤 도움이 가장 중요 할 수 있습니다. 많은 감사드립니다.

+0

이 숙제입니까? – fortran

+0

"father"프로세스를 설정하여 종료 된 childeren을 검사하는 것 외에는 아무 일도하지 않습니다. 따라서 크랙의 가능성을 줄입니다. 당신은 모든 과정을 일해야합니다. – eaanon01

답변

1

귀하의 질문에 조금 불분명하지만 비슷한 상황에서 내가 생각한 몇 가지 사항을 언급 할 것입니다.

프로세스를 생성 할 때 SIGCHLD을 일시적으로 차단하고 하위 프로세스 레코드 (및 처리 방법)를 테이블에 저장할 수 있습니다. 사망 (또는 정지 또는 무엇이든) 테이블에 그들을 위해 뭔가를 할

child_table_node_t * node = malloc(sizeof(child_table_node_t)); 
// err check that 
child_table_node_init(node, type_of_child_stuff); 

sigset_t old, set; 

sigemptyset(&set); 
sigaddset(&set, SIGCHLD); 
sigprocmask(SIG_BLOCK, &set, &old); 
pid_t pid = fork(); 
if (pid > 0) { 
    node->pid = pid; 
    add_to_table(alive_children, node); 
    sigprocmask(SIG_SETMASK, &old, NULL); 
    // other stuff 
} else { 
    sigprocmask(SIG_SETMASK, &old, NULL); 
    if (!pid) { 
     // do child stuff 
    } else { 
     // do parent with no child stuff 
    } 
} 

귀하의 handle_sigchild 다음 찾아 볼 수 있습니다 아이들. alive_children 테이블에서 테이블을 제거하고 신호 처리기의 dead_children 테이블에 넣는 것이 좋습니다. 그러면 응용 프로그램이 더 쉽게 처리하고 메모리를 할당 해제 할 수 있습니다. 아이들이 멈추어있을뿐만 아니라 죽어 가고 있기를 원한다면 조금 더 복잡한 b/c를 얻게 될 것입니다. 살아있는 테이블에서 그들을 제거하고 싶지는 않을 것입니다. 변경된 노드를 찾기 위해 비 신호 코드에서 테이블을 탐색하는 것이 더 쉽습니다. 이 경우 노드를 추가하거나 제거 할 때를 제외하고는 신호를 차단하지 않고도 처리 할 수 ​​있습니다.

그러면 응용 프로그램은 해당 프로세스의 테이블 노드에 저장된 데이터를 기반으로 죽은 하위 작업을 수행 할 수 있습니다. 만약 아이가 전경에 있다면 그것은 죽음 (또는 행동 정지)은 종료 코드 변수에 종료 코드를 저장하고 터미널이나 스크립트에서 명령을 다시 시작하는 것입니다. 새로 사망 한 아이가 백그라운드 프로세스 인 경우 종료 코드를 기록한 다음 다음 번에 명령 프롬프트를 인쇄하기 전에 터미널에보고합니다 (대화식 모드 인 경우).

+1

귀하의 제안은 매우 유용했습니다. 우리는 마침내 signal_handler에서이 PID들만을 기다리기 위해 배경 프로세스의 PID를 저장하는 배열을 만들었습니다. 답변 해 주셔서 감사합니다. – PID

+0

도움이 되었기 때문에 기쁩니다. 프로젝트와 함께 행운을 빈다 :-) – nategoose

관련 문제