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提供了大量能使我們快速便捷地處理數據的函數和方法。
#include <cstdio>
#include <unistd.h>
#include <stdio.h>
#include <sys/wait.h>
#include <stdlib.h>
int main()
{pid_t pid, wpid;int status;pid = fork();if (pid == 0){printf("----child, my parent=%d,going to sleep 3s\n",getppid());sleep(3);printf("---------------child die ---------------------\n");}else if (pid > 0){wpid = wait(&status);if (wpid == -1){perror("wait erroe:");exit(1);}//進程正常結束if (WIFEXITED(status)){printf("child exit with %d\n",WEXITSTATUS(status));}//異常退出的信號if (WIFSIGNALED(status)){printf("child killed by %d \n", WTERMSIG(status));}while (1){printf("I am parent,pid= %d,myson=%d\n",getpid(),pid);sleep(1);}}return 0;
}
子進程休眠三秒,主進程因為有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;
}