1.等待終止的子進程(僵死進程): 如果一個子進程在父進程之前結束,內核會把子進程設置為一個特殊的狀態,處於這種狀態的進程稱為僵死進程 當父進程獲取了子進程的信息後,子進程才會消失。 pid_t wait(int *status); 父進程調用這個方法會被阻塞住,如果子進程終止的時候,此方法會調用並 ...
1.等待終止的子進程(僵死進程):
如果一個子進程在父進程之前結束,內核會把子進程設置為一個特殊的狀態,處於這種狀態的進程稱為僵死進程
當父進程獲取了子進程的信息後,子進程才會消失。
pid_t wait(int *status);
父進程調用這個方法會被阻塞住,如果子進程終止的時候,此方法會調用並且返回終止子進程的pid
#include <stdio.h> #include <unistd.h> #include <sys/wait.h> int main(){ int pid,ppid; int ret=fork(); if(ret>0){ pid=getpid(); ppid=getppid(); printf("我是父進程,pid=%d , ppid=%d ,我新建的子進程pid=%d\n",pid,ppid,ret); int status; int sonPid=wait(&status); printf("我的子進程,pid=%d,終止了\n",sonPid); }else if(ret==0){ sleep(2); pid=getpid(); ppid=getppid(); printf("我是子進程,pid=%d , ppid=%d \n",pid,ppid); }else if(ret==-1){ perror("fork"); } }
輸出:
我是父進程,pid=22315 , ppid=12479 ,我新建的子進程pid=22316
我是子進程,pid=22316 , ppid=22315
我的子進程,pid=22316,終止了
2.如果父進程在子進程之前終止了,那麼系統會把子進程設置給init進程(pid為1),init進程會周期性的等待所有的子進程,確保沒有長時間的僵死進程