目錄
0x01 linux中特殊的進程
0x02 進程的標識
0x03 創建子進程
0x01 linux中特殊的進程
- 0號進程:idle進程,系統啟動加載的進程
- 1號進程:systemd進程,系統初始化,是所有進程的祖先進程 init
- 2號進程:kthreadd進程,負責內核中所有進程的調度和管理
0x02 進程的標識
- 每個進程都會有一個非負整數來標識進程,pid
- 查看進程的命令 ps -ef | grep yourprocessname
從左到右依次是:啟動進程的用戶 進程的id標識 父進程的id cpu占用率 開始時間 啟動設備 運行總時間 啟動時執行的命令
# 使用getpid(void)可以獲取進程的id
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<unistd.h>int main(){printf("進程的id=%d",getpid());printf("進程的父進程id=%d",getppid());sleep(10);return 0;
}
0x03 創建子進程
- 使用fork函數可以創建新的進程
- 在子進程調用fork函數創建進程會返回0,在父進程中使用fork函數會返回進程的ID
- 子進程是父進程的副本
- 子進程獲得了父進程的數據空間,堆和棧的副本,不是共享,子進程改變數據,不會影響父進程變量的數據
- 如果父進程先退出,子進程會成為孤兒進程,1號進程會管理孤兒進程,對子進程的狀態進行收集工作
- 如果子進程先退出,內核會向父進程發送一個SIGCHLD的信號,如果父進程不處理這個信號,子進程會成為僵尸進程
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>#include<signal.h>void func(int sig){int state;wait(&state);
}
int main(){// 1忽略子進程的sigchld// signal(SIGCHLD,SIG_IGN);// 3使用函數處理信號signal(SIGCHLD,func);File* file=fpopen("/tmp/tmp.txt","w+");fprintf(file,"this is a test\nfflush(file);printf("進程的id=%d",getpid());sleep(10);printf("進程的id=%d",getpid());int pid=fork();printf("fork出的id為%d",pid);sleep(1);if(pid==0){printf("子進程的id為%d",getpid());printf("子進程的父進程id為%d",getppid//子進程的邏輯代碼fprintf(fp,"子進程 this is a test\n");}if(pid>0){printf("父進程的id為%d",getpid());printf("父進程的父進程id為%d",getppid());//父進程的邏輯代碼fprintf(fp," 父進程 this is a test\n");//2 等待子進程退出的代碼 使用wait方式阻塞等待子進程退出// int state;// wait(&state);}printf("進程的id=%d",getpid());sleep(30);printf("進程的id=%d",getpid());fclose(file);
}