2011-05-11 1 views
3

다른 프로세스를 현재 프로세스와 병렬로 실행하려고합니다. 그러나 커맨드 라인 프로그램이 때때로 비정상적으로 종료된다는 사실을 알게되고, 그것은 내 메인 프로그램도 죽입니다.부모/자식이 비정상적으로 종료되면 fork 된 프로세스가 유지됩니다. (C++)

// MAIN PROGRAM 
pid = fork(); 
char *argv[] = { stuff.. }; 
if (pid == 0) { 
    int rc = execv("command line program...", argv); 
    } 

// DO OTHER STUFF HERE. 

if (pid > 0) { 
    waitpid(pid, 0, 0); 
} 

명령 줄 프로그램이 비정상적으로 종료 된 후에도 내 메인 프로그램을 계속 실행할 수 있습니까? 감사!

[UPDATE] : 예, 주 프로세스는 명령 줄을 읽는 파일에 기록하지만 파이프가 아닌 일반 파일입니다. 나는 세그 폴트를 받는다.

자식 프로세스가 자주 충돌하지 않기 때문에 버그를 재현하는 것이 매우 어렵습니다. 그러나 그것은 일어난다. 무작위 적으로 충돌하는 것은 커맨드 라인 프로그램에서 알려진 버그이며, 커맨드 라인이 죽어도 내 메인 프로그램을 유지하려고합니다. 실제 코드에서

+0

게시 한 내용에 따라 나는 주 프로그램이 왜 죽을지 알 수 없습니다. 이것은 실제로 일어나는 일입니까, 아니면 당신이 걱정하고있는 일입니까? – Duck

+1

부모와 자녀가 어떻게 든 상호 작용하지 않는 한, 자녀의 죽음이 부모 과정에 영향을 미치지 않을 것입니다. 부모가 파이프를 통해 자녀에게 읽고 쓰는가? SIGPIPE 신호가 아마도 나옵니까? 아니면 다른 신호? –

+0

@ 오리, 그러나 실제로 그것은 실제로 일어납니다 ... 그래서 이것이 올바른 방법이라고 생각하십니까? – CodeNoob

답변

1

은 당신이 다른 여기가 수행

if (pid == 0) { 
    int rc = execv("command line program...", argv); 
    // possibly more child stuff 
} 
else { 
    // parent stuff 
} 

그것은 항상 여기에 질문을 할 때 실제 코드를 게시하는 것이 좋습니다.

1
  • fork 대신 vfork을 사용하면 불필요한 프로세스 복제를 피할 수 있습니다.
  • 부모 프로세스가 SIGCHLD을 받았을 때 충돌이 발생하지 않았는지 확인하십시오.
  • 적절한 if-then-else 문을 사용하여 부모 프로세스에서 실행되는 코드와 자식 프로세스에서 발생하는 작업을 명확하게 만듭니다. 예를 들어, 자식과 프로세스 모두 // DO OTHER STUFF HERE. 주석이있는 코드를 실행할 가능성이 높습니다. execv이 실패합니다.
  • 결국 gdb을 사용하십시오. 충돌이 발생한 곳을 알려줍니다.
+0

APEW (Stevens, Rago)에 따르면 모든 유닉스 계열 시스템에는 'vfork'가 존재하지 않는다는 점에 유의해야한다고 생각합니다. 리눅스와 다른 유닉스 계열 시스템에서도 그렇습니다. – 0xC0000022L

+0

POSIX는'vfork()'를 대체 할'posix_spawn()'을 가지고 있습니다. – ninjalj