2012-12-06 2 views
4

자식 프로세스에서 반짝임 명령 줄을 실행하려고합니다. 이런 예 :linux fork-execl, 실행 된 프로세스가 좀비가됩니다

10020 pts/1 Z+  0:00 [twinkle] <defunct> 
10040 pts/1 Z+  0:00 [twinkle] <defunct> 
10053 pts/1 Z+  0:00 [twinkle] <defunct> 
10064 pts/1 Z+  0:00 [twinkle] <defunct> 
10097 pts/1 Z+  0:00 [twinkle] <defunct> 
10108 pts/1 Z+  0:00 [twinkle] <defunct> 
10130 pts/1 Z+  0:00 [twinkle] <defunct> 

제가 신호 (SIGCHLD, SIG_IGN)을 설정하려고;

int hangup() { 
write_on_display("line3", "   "); 
write_on_display("hide_icon", "DIALTONE"); 
write_on_display("hide_icon", "BACKLIGHT"); 

int pid = fork(); 
if (pid == 0) { 
    int res = execl("/usr/bin/twinkle", " ", "--immediate", "--cmd", 
      "answerbye", (char *) NULL); 
    _exit(0); 
} else { 
    perror("hangup"); 
    return 0; 
} 
return 1; 
} 

을하지만 반짝임 좀비진다 하지만 성공하지 못했습니다. 실제로 나는 반짝 반짝 빛나기 전에 자식 프로세스가 죽었다고 생각합니다. 같은 명령 줄에서

실행 반짝 :

twinkle --immediate --call 100 

좀비가되지 않습니다 - 반짝 제대로 닫습니다. 내가 누락 된 부분은 무엇입니까?

답변

7

부모 프로세스는 자식의 프로세스 ID로 waitpid()을 호출해야합니다. 링크 된 참조 페이지에서 :

이러한 시스템 호출은 모두 호출 프로세스의 하위에서 상태 변경을 기다리고 상태가 변경된 하위에 대한 정보를 얻는 데 사용됩니다. 주 변경은 다음과 같은 것으로 간주됩니다. 그 아이는 신호에 멈추었다. 또는 아이가 신호로 재개되었다. 종료 된 하위의 경우 대기를 수행하면 시스템이 하위와 관련된 자원을 해제 할 수 있습니다. 대기가 수행되지 않으면 종료 된 자식은 "좀비"상태로 유지됩니다 (아래 참고).

예를 들어

:

pid_t pid = fork(); 
if (0 == pid) 
{ 
    /* Child process. */ 
} 
else 
{ 
    /* Parent process, wait for child to complete. */ 
    int status; 
    waitpid(pid, &status, 0); 
} 
+0

그냥 (!) 참고 : 'execl'는 오류가 발생하지 않는 한 IIRC, execl''후 코드가 * * 실행되지 않습니다. – Jite

+0

@Jite, 맞습니다. 'execl()'이 성공하면'exit (0);'_disappears_가 나타난다. – hmjd

2

네,하지만 난 비동기 작업을 부모와 자식이 필요합니다.

사실 내 실수를 발견했습니다. 그래서, 누군가가 비슷한이 같은 신호 핸들러 함수에 문제가있는 경우 :

void catch_child(int sig_num) 
{ 
    /* when we get here, we know there's a zombie child waiting */ 
    int child_status; 

    wait(&child_status); 

} 

및 신호 (SIGCHLD, catch_child) 모든 작동 main() 함수에서

합니다. 여기

PP : is a very good explanation.

+0

부모 프로세스에서 "자식 프로세스 끝"신호를 잡아서 거기서 기다리는 것이 좋습니다. 정말 효과가 있습니까? –

관련 문제