Linux系统编程(二)孤儿进程和僵尸进程
生活随笔
收集整理的這篇文章主要介紹了
Linux系统编程(二)孤儿进程和僵尸进程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Linux系統編程(二)
- 一、exec函數族
- 1.exec函數
- 二、孤兒進程和僵尸進程
- 三、wait和waitpid
- 1.wait函數
- 2.waitpid函數
一、exec函數族
exec函數使用時,改程序的用戶空間的代碼和數據會被新程序給替代,會從新程序的啟動例程開始。調用exec并不創建新進程,調用前與調用后進程的id并不會改變
1.exec函數
代碼如下(示例):
#include <cstdio> #include <stdio.h> #include <sys/wait.h> #include <stdlib.h> #include <unistd.h>int main() {pid_t pid, wpid;int n = 3;int i;for (i = 0; i < n; i++){pid = fork();if (pid == 0){break; //子進程就退出}}//主進waitpid回收if (i == n){sleep(n);printf("-----parent process ");do {wpid = waitpid(-1,NULL,WNOHANG);} while (wpid==0);}else{sleep(i);printf("-----%dth child process \n",i+1);if (i == 0){//execlp("ps","ps",NULL);}else if (i == 1){printf("child process's pid = %d \n",getpid());execl("./hello","hello",NULL);}}return 0; }二、孤兒進程和僵尸進程
孤兒進程:父進程先于子進程結束,子進程就變成孤兒進程,子進程的父進程就變成了init進程,由init進程自動回收子進程
僵尸進程:子進程終止后,父進程并沒有進行回收,子進程殘留資源(PCB)仍保留在內核中,變成僵尸進程
殺死僵尸進程方法:
1.殺死父進程,子進程就變成孤兒進程,由init進程自動回收
2.使用wait和waitpid函數回收僵尸進程
三、wait和waitpid
1.wait函數
提示:這里對文章進行總結:
例如:以上就是今天要講的內容,本文僅僅簡單介紹了pandas的使用,而pandas提供了大量能使我們快速便捷地處理數據的函數和方法。
子進程休眠三秒,主進程因為有wait會阻塞,等子進程執行完畢后,才會執行主進程的代碼,同時對其進行回收。
PS注意:如果同時創建多個進程,wait函數會等待第一個執行完成的進程并對其回收,這個進程可能是多個進程里的任意一個。
2.waitpid函數
作用同wait,但可指定pid進程清理,可以不阻塞
#include <cstdio> #include <unistd.h> #include <sys/wait.h> #include <stdio.h> #include <stdlib.h>int main() {pid_t pid,wpid;int n = 5;int i;for (i = 0; i < n; i++){pid = fork();if (pid==0){break; //子進程退出}}//主進程邏輯if (n == i){sleep(n);printf("I am parent ,pid = %d\n",getpid());do{wpid=waitpid(-1, NULL, WNOHANG);//使用WNOHANG模式,主進程不會阻塞,子進程仍在運行返回0//if wpid ==0說明進程在運行sleep(1);} while (wpid==0);while (1){}}else {sleep(i);printf("I'm %dth child ,pid = %d , gpid = %d\n",i+1,getpid(),getgid());exit(1);}printf("hello from %s!\n", "test_waitpid");return 0; } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Linux系统编程(二)孤儿进程和僵尸进程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 成都欢乐谷年卡包含所有项目吗
- 下一篇: 摩码者剧情介绍