2017-05-26 141 views
0

我有一個c程序,用fork和execlp執行另一個進程(bash腳本)。當我想要殺死這個進程時,它會移動到殭屍狀態。爲什麼是這樣??叉,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

您應該致電waitpid(2)或其他等待系統調用(wait4(2) ...)以避免有zombie processes。順便說一句,你也可以處理SIGCHLD信號,以便在子進程終止(或更改狀態)時通知。

一般來說,你最好先用kill(2)SIGTERM(只是後來,隨着SIGKILL),因爲這個過程 - 你backup.sh腳本 - 可以正確處理(使用trap內置在shell腳本)的信號(但SIGKILL進程不能被抓到,備份可能會在磁盤上留下混亂或無用的文件)。另請參見signal(7) & signal-safety(7)

閱讀Advanced Linux Programming(我們無法解釋什麼是由免費提供書籍給幾個章節中只有幾個段落)。

順便說一下,在系統調用失敗時,在消息中更好地使用perror(3)strerror(errno)

+0

那麼,使用fork的進程應該等待(waitpid)的子進程?我在我的通用程序(嵌入式平臺)中使用fork,所以我不能等待子進程(我將不得不創建特定的線程) –

+0

是的,在某些時候,您應該「等待」或「waitpid」。但是,閱讀更多關於'SIGCHLD'的信息 –