귀하의 질문에 조금 불분명하지만 비슷한 상황에서 내가 생각한 몇 가지 사항을 언급 할 것입니다.
프로세스를 생성 할 때 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를 얻게 될 것입니다. 살아있는 테이블에서 그들을 제거하고 싶지는 않을 것입니다. 변경된 노드를 찾기 위해 비 신호 코드에서 테이블을 탐색하는 것이 더 쉽습니다. 이 경우 노드를 추가하거나 제거 할 때를 제외하고는 신호를 차단하지 않고도 처리 할 수 있습니다.
그러면 응용 프로그램은 해당 프로세스의 테이블 노드에 저장된 데이터를 기반으로 죽은 하위 작업을 수행 할 수 있습니다. 만약 아이가 전경에 있다면 그것은 죽음 (또는 행동 정지)은 종료 코드 변수에 종료 코드를 저장하고 터미널이나 스크립트에서 명령을 다시 시작하는 것입니다. 새로 사망 한 아이가 백그라운드 프로세스 인 경우 종료 코드를 기록한 다음 다음 번에 명령 프롬프트를 인쇄하기 전에 터미널에보고합니다 (대화식 모드 인 경우).
이 숙제입니까? – fortran
"father"프로세스를 설정하여 종료 된 childeren을 검사하는 것 외에는 아무 일도하지 않습니다. 따라서 크랙의 가능성을 줄입니다. 당신은 모든 과정을 일해야합니다. – eaanon01