2013-12-15 3 views
2

더 복잡한 신호와 분기 질문이 확실하지 않습니다. 자녀 또는 부모로부터의 신호 호출간에 차이가 있습니까?신호가있는 포크 사용 방법은 무엇입니까?

자식이 분기되면 부모가되었지만 이전 부모 만 자식입니까?

핸들러가 포함되어 있으므로 기본 핸들러가 유효하지 않습니다. 프로세스를 종료하지 않으려면 SIGINT을 변경할 수 있습니까?

int count = 0; 

void killhandler(int sig){ 
    printf("SIGKILL received\n"); 
    return; 
} 

void childhandler(int sig){ 
    int status; 
    wait(&status); 
    count += WEXITSTATUS(status); 
    return; 
} 

main(){ 
    int i; // for loop iterator 
    pid_t pid[3]; // pids of child processes 
    Signal(SIGKILL, killhandler); 
    Signal(SIGCHLD, childhandler); 
    // Fork 3 child processes 
    for(i=0; i<3; i++){ 
     pid[i] = fork(); 
     if(!pid[i]){ // If child process 
      Signal(SIGKILL, SIG_DFL); 
      exit(5); 
     } 
    } 

    // Parent process only 
    for(i=0; i<3; i++){ 
     kill(pid[i], SIGKILL); 
    } 
    sleep(5); 
    printf("count = %d\n", count); 

    exit(0); 
} 

"SIGKILL received"이 인쇄되지 않습니까?

이유가 될 만 셀 수 : 0, 자식 프로세스는 갈래 5, 10, 15

답변

1

, 그것은 부모 프로세스의 정확한 사본에 매우 가깝습니다.

  1. 부모 프로세스 ID가
  2. 프로세스 ID가 다른 상이한 : 단일 스레드 프로세스와, 세 가지 중요한 차이점이있다.
  3. fork()의 리턴 값

이 다른 (다른 차이점 들어 fork() 대한 POSIX 매뉴얼 페이지 참조.) 하위에 상기 신호 처리기는 부모와 동일하다. 그러나 아이는 확실하고 독립적으로 신호 처리기를 변경할 수 있습니다.

당신은 SIGKILL을 잡으려고 신호 처리기를 설정할 수 없습니다. 그 신호는 결코 잡힐 수 없다. 어린이나 부모로부터의 신호 호출 차이가

2

있습니까?

신호를 수신하는 프로세스에 어떤 영향을 주는지에 관해서는 아니오.

자식이 분기되면 부모가되지만 이전 부모 만 자식입니까?

그것은 확실히 부모의 자식입니다. 그것이 부모가되는지 아닌지는 그것이 자신의 자녀를 포크하는지 여부에 달려 있습니다.

핸들러가 포함되어 있기 때문에

는 잘못된 기본 핸들러입니다. SIGINT를 변경하여 프로세스를 종료 할 수 있습니까?

SIGINT의 기본 처분은 프로세스를 종료하는 것이지만 SIGINT를 잡아서 처리하거나 차단하거나 무시할 수 있습니다. 기본 처분은 다시 변경 (그리고 경우)까지 너무 많은 잘못된 오버라이드 (override)으로하지 않습니다.

이유는 "SIGKILL은 수신"인쇄되지 않습니다?

SIGKILL을 차단, 무시 또는 포착 할 수 없습니다. 핸들러는 SIGKILL을 호출하지 않기 때문에 아무 것도 출력하지 않습니다. SIGSTOP은 마찬가지로 무시하거나 차단하거나 처리 할 수 ​​없습니다. 이것들은 두 가지 특별한 신호입니다.

프로그램에서 SIGKILL을 기본값으로 설정하려고합니다. 실제로는 만 처리됩니다. 자녀가 즉시 종료되기 때문에 자녀가 이미 사망하고 부모의 kill이 ESRCH로 인해 실패했을 수 있으므로 부모의 신호가 전달되지 않을 수 있습니다. 그 pid를 가진 아이는 더 이상 존재하지 않습니다. sleep은 도움이 될 수 있으므로 충분히 오래 살 수 있습니다. (이 용어를 좋아해야합니다.)

WEXITSTATUS의 사용이 잘못되었습니다. 당신의 의도가 죽기보다는 자신의 의지로 나간 아이들의 수를 세는 것이라면 WIFEXITED 또는 WIFSIGNALED를 사용하는 간단한 카운터가 필요할 것입니다. WEXITSTATUS는 자체적으로 종료 한 자식의 상태 코드를 반환합니다. 0 또는 1 또는 50 또는 75 일 수 있습니다. 변수에 추가하는 것은 아마도 원하는 것이 아닙니다.

양파에 여러 개의 레이어가 있기 때문에 신호가 혼란스럽고, 규칙과 플랫폼 관련 의미에 대해 충분한 예외가 있기 때문에 신호가 혼란 스럽습니다. 나는 그 (것)들을 완전히 덮는 단일 근원을 결코 찾아 내지 않았다. 즉, 신호 처리 및 처리기는 양파의 바깥 레이어이며 웹에서 사용할 수있는 많은 소스가 있습니다.

관련 문제