小兔自助建站廣州排名推廣
目錄
一、孤兒進程
?二、僵尸進程
?三、守護進程(精靈進程)
一、孤兒進程
? ? ? ? 定義:孤兒進程是指那些其父進程已經(jīng)結(jié)束,但它們依然在運行的進程
創(chuàng)建一個孤兒進程:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h>int main() {pid_t pid = fork(); // 創(chuàng)建子進程if (pid < 0) {// fork失敗perror("fork");exit(EXIT_FAILURE);}if (pid == 0) {// 子進程printf("Child process: PID=%d, PPID=%d\n", getpid(), getppid());// 暫停子進程,以便父進程有足夠時間退出sleep(10);// 父進程退出后,子進程成為孤兒進程printf("Child process (orphan): PID=%d, PPID=%d\n", getpid(), getppid());//父進程退出后查看子進程的父進程id和子進程id} else {// 父進程sleep(1);printf("Parent process: PID=%d\n", getpid());//父進程ID// 父進程退出exit(EXIT_SUCCESS);}return 0; }
主要進程標識:
進程號:PID(process id)
父進程號:PPID(parent process id)
進程組號:PGID,進程組:若干個進程的集合稱之為進程組,默認情況下,新創(chuàng)建的進程會進程父進程的進程組ID
會話組號:SID,會話組:若干個進程組的集合稱之為會話組,默認情況下,新創(chuàng)建的進程會繼承父進程的會話ID
?二、僵尸進程
? ? ? ? 定義:?僵尸進程(Zombie Process)是指那些已經(jīng)完成執(zhí)行但仍然存在于系統(tǒng)中的進程。這些進程已經(jīng)終止,但它們的進程控制塊(PCB)還未被父進程讀取和清理。
創(chuàng)建一個僵尸進程:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h>int main() {pid_t pid = fork();if (pid < 0) {perror("fork");exit(EXIT_FAILURE);}if (pid == 0) {// 子進程printf("Child process: PID=%d\n", getpid());// 子進程終止,但父進程故意不調(diào)用wait()來清理exit(EXIT_SUCCESS);} else {// 父進程printf("Parent process: PID=%d\n", getpid());// 父進程故意不調(diào)用wait(),等待子進程成為僵尸sleep(5); // 讓子進程有時間成為僵尸printf("Parent process exiting\n");// 父進程退出exit(EXIT_SUCCESS);}return 0; }
?三、守護進程(精靈進程)
? ? ? ? 定義:守護進程(精靈進程)(Daemon Process)是指那些在后臺運行的進程,通常不與用戶直接交互。精靈進程在系統(tǒng)啟動時啟動,持續(xù)運行,并在系統(tǒng)關(guān)閉時退出。它們通常用于提供系統(tǒng)服務(wù)或進行系統(tǒng)管理任務(wù)。
創(chuàng)建一個精靈進程:
1、創(chuàng)建孤兒進程pid = fork() if(pid > 0)exit(0);2、創(chuàng)建新的會話組:讓孤兒進程成為會話組組長 可以讓子進程完全獨立,脫離其他兄弟,親緣進程的控制setsid();//創(chuàng)建新會話,當前進程變?yōu)闀捊M組長3、修改進程的工作路徑(運行目錄),比如:家目錄,根目錄 chdir(新路徑)4、重設(shè)文件權(quán)限掩碼 umask(0);5、關(guān)閉所有的文件描述符:從父進程得到的文件描述符用不到,全部關(guān)閉 getdtablesize() == max + 1 for(int i = 0;i < getdtablesize ;i++)close(i);
實現(xiàn)代碼:
//創(chuàng)建一個守護進程 #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<wait.h> #include<sys/stat.h> #include<sys/types.h> #include<fcntl.h> int main(int argc, const char *argv[]) {//1、創(chuàng)建一個孤兒進程pid_t pid=fork();if(pid>0)exit(0);//2、創(chuàng)建一個會話組setsid();//3、修改工作路徑chdir("/home/ubuntu/test");//4、重設(shè)文件權(quán)限掩碼umask(0);//5、關(guān)閉其他文件描述符,包括終端文件for(int i=0;i<getdtablesize();i++)close(i);//守護進程創(chuàng)建成功//用守護進程寫入數(shù)據(jù)進入文件int fd = open("1.txt",O_WRONLY|O_TRUNC|O_CREAT,0664);char *p="hello world";while(1){write(fd,p,10);sleep(1);}close(fd);return 0; }