程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> 孤兒進程與僵屍進程[一]

孤兒進程與僵屍進程[一]

編輯:關於C

 

在UNIX 系統中,一個子進程結束了,但是他的父進程沒有等待(調用wait / waitpid)他, 那麼這個子進程將變成一個僵屍進程。 但是如果該進程的父進程已經先結束了,那麼該進程就不會變成僵屍進程, 因為每個進程結束的時候,系統都會掃描當前系統中所運行的所有進程, 看有沒有哪個進程是剛剛結束的這個進程的子進程,如果是的話,就由Init (進程號為1)來接管他,成為他的父進程,此時稱這個進程為孤兒進程,其狀態收集工作由init進程負責。

 

以下是一個孤兒進程的示例程序,在此程序中,讓父進程先退出,然後子進程再次打印自己的父進程號:

 

 

view plain

#include <unistd.h> 

#include <stdio.h> 

#include <stdlib.h> 

main() 

    pid_t pid; 

    if((pid=fork)==-1) 

    perror("fork"); 

    else if(pid == 0) { 

        printf("pid=%d,ppid=%d\n",getpid(),getppid());//打印pid,ppid 

    sleep(2);//休眠以讓父親進程先退出 

    printf("pid=%d,ppid=%d\n",getpid(),getppid());//打印pid,ppid 

     } 

 else exit(0); 

 

 

注:getpid函數可以獲得當前進程的pid,getppid函數可以獲得當前進程的父進程號。

 

 

 

以上程序編譯運行後的輸出為:

 

pid=1091,ppid=1090

pid=1091,ppid=1.

可以看出子進程1091後來被init進程接管(pid=1).

 

摘自 日新為道的專欄

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved