2017-05-26 6 views
0

私はforkとexeclpを使って別のプロセス(bashスクリプト)を実行するcプログラムを持っています。私はこのプロセスを殺したいとき、ゾンビ状態に移ります。どうしてこれなの??フォーク、execlpと殺す。ゾンビプロセス

は、プロセスを作成します。

switch (PID_BackUp= fork()) 
    { 
     case -1: 
      perror("fork"); 
      printf("An error has occurred launching backup.sh script!\n"); 
      break; 

     case 0: 
      execlp("/usr/local/bin/backup.sh", "/usr/local/bin/backup.sh", NULL, NULL, NULL); 
      break; 

     default: 
      printf("backup.sh script launched correctly! PID: %d\n", PID_BackUp); 
      break; 
    } 

は、プロセスを強制終了します。

if(kill(PID_BackUp,SIGKILL)==-1) 
     fprintf(stderr, "No se ha podido matar el programa: %d\n", PID_BackUp); 
    else 
     printf("\nProceso con identificador %d, se ha abortado\n", PID_BackUp); 

だから、この時点でプロセスがゾンビ状態に移行します。私が間違っていることは何ですか?

答えて

4

zombie processesを避けるには、waitpid(2)またはその他の待機システムコール(wait4(2) ...)に電話する必要があります。また、子プロセスが終了した(または状態が変更された)ときに通知されるように、SIGCHLDシグナルを処理することもできます。

一般的に、あなたはより良い(SIGKILLとし、それ以降でのみ、)SIGTERMとプロセスkill(2)最初backup.sh script-が信号を(シェルスクリプトでtrap組み込みを使用して)を正しく扱うことができる(ただし、SIGKILLができない - あなたのそのプロセスからよディスクにクラッタや無駄なファイルが残ってしまう可能性があります)。 (私たちは、わずか数段落でいくつかの章ではその自由に利用可能な本を読んで教えられているかを説明することはできません)もsignal(7) & signal-safety(7)

Advanced Linux Programmingをお読みください。

現時点では、システムコールが失敗したときにメッセージにperror(3)またはstrerror(errno)をよく使用してください。

+0

したがって、フォークを使用するプロセスは、子プロセスのために待機(waitpid)する必要がありますか?私は一般的なプログラム(組み込みプラットフォーム)でforkを使用しているので、子プロセスを待つことができません(特定のスレッドを作成しなければなりません)。 –

+0

はい、ある時点でwaitまたはwaitpidを実行する必要があります。しかし、 'SIGCHLD'についてもっと読む –

関連する問題