2012-05-31 2 views
0

이것은 내 코드이며, 간단하게 처리했습니다. 아버지 프로세스가 블록을 설정하는 동안 SIGCHLD

#include <stdio.h> 
#include <unistd.h> 
#include <signal.h> 
#include <sys/wait.h> 

void signal_handle(int sig) 
{ 
    int status; 
    wait(&status); 
} 

int main() 
{ 
    pid_t pid = fork(); 

    if (pid > 0) 
     signal(SIGCHLD, signal_handle); 
    if (pid == 0) { 
     if (execl("/bin/ls", "/", (char *)0) < 0) 
     { 
      perror("execl"); 
      return -1; 
     } 
    } 
    return 0; 
} 

나는 그것을 실행

, 나는 아들 프로세스가 실행 결과를 출력하지만, 아버지 과정 이 차단 된 것을 발견했다.

아버지가 아들 프로세스가 많은 경우 어떻게해야합니까? 각 1 대에 wait(&status)을 설정 하시겠습니까?

영어로는 매우 유감 스럽습니다.

+0

'execl()'또는'exec *()'함수의 다른 멤버의 상태. 반환하면 실패했습니다. 성공하면 복귀하지 않습니다. –

+0

['execl'] (http://linux.die.net/man/3/execl)의 매뉴얼 페이지를 더보아야합니다. 호출은'execl ("/ bin/ls", "ls" , "/", NULL); –

+0

서면으로 (일종의) OK입니다. 'ls' 프로그램에 이름이'/'이고'ls'는 파일 이름 인수가 없으므로 현재 디렉토리를 나열합니다. (그러나 당신은 정확합니다; 그것은 아마 의도 한 것이 아닙니다.) –

답변

1

부모 프로세스가 중단되는 이유가 표시되지 않으며 내 컴퓨터에 표시되지 않습니다.

fork() 다음에 부모 프로세스는 signal()을 호출하여 신호 처리기를 설정하고 즉시 종료합니다. 한편, 자식은 "/" 인수가 argv[0]이되고 프로그램 이름이 있고 추가 인수가 없기 때문에 현재 디렉터리의 내용을 인쇄하기 위해 ls을 실행합니다. 그런 다음 종료됩니다. 매우 드문 상황을 제외하고는, 부모는 자녀가 완료되기 훨씬 전에 퇴장했습니다.

당신이 신호 '아이의 죽음을'때까지 기다리는 부모 프로세스를 원하는 경우에, 부모 만 실행 경로에 pause()에 호출을 추가 : 당신은 테스트 할 필요가 없습니다

#include <stdio.h> 
#include <unistd.h> 
#include <signal.h> 
#include <sys/wait.h> 

static void signal_handle(int sig) 
{ 
    int status; 
    pid_t pid = wait(&status); 
    printf("%d: signal %d child %d status 0x%.4X\n", (int)getpid(), sig, (int)pid, status); 
} 

int main(void) 
{ 
    pid_t pid = fork(); 

    if (pid > 0) 
    { 
     signal(SIGCHLD, signal_handle); 
     pause(); 
    } 
    else if (pid == 0) 
    { 
     execl("/bin/ls", "ls", "/", (char *)0); 
     perror("execl"); 
     return -1; 
    } 
    else 
     perror("fork"); 
    return 0; 
} 
관련 문제