系統編程-進程-進程鏈、進程扇
1. 進程鏈、進程扇 圖示
所謂進程鏈就是父進程創建一個子進程,創建的子進程再次創建出屬於自己的子進程,這樣依次往下循環。
所謂的進程扇就是一個父進程創建出多個子進程。
2. 進程鏈
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main(){
int i=0;
for(i=0; i<5; i++){
pid_t pid = fork();
if(pid < 0){
perror("fork ");
}else if(pid > 0){
break;
}
sleep(3);
}
printf("pid: %d, ppid: %d\n", \
getpid(), getppid());
while(1);
return 0;
}
編譯運行:
root@lmw-virtual-machine:/home/lmw/MINE/Linux_C_exercise/fork/進程鏈和進程扇# gcc fork_list.c
root@lmw-virtual-machine:/home/lmw/MINE/Linux_C_exercise/fork/進程鏈和進程扇# ./a.out
pid: 9957, ppid: 9905 // 一旦執行./a.out,這條語句就會立馬打印。
pid: 9958, ppid: 9957 // 延時3秒後,main進程的子進程執行到該打印語句。
pid: 9959, ppid: 9958 // 延時3秒後,main進程的孫進程執行到該打印語句。
pid: 9960, ppid: 9959
pid: 9962, ppid: 9960
pid: 9963, ppid: 9962
^C
root@lmw-virtual-machine:/home/lmw/MINE/Linux_C_exercise/fork/進程鏈和進程扇#
實驗截圖:
3. 進程扇
實驗1
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main(){
int i=0;
printf("before fork : pid: %d, ppid: %d\n", \
getpid(), getppid());
for(i=0; i<5; i++){
pid_t pid = fork();
if(pid < 0){
perror("fork ");
}else if(0 == pid){
break;
}
}
printf("pid: %d, ppid: %d\n", \
getpid(), getppid());
while(1);
return 0;
}
編譯運行:
root@lmw-virtual-machine:/home/lmw/MINE/Linux_C_exercise/fork/進程鏈和進程扇#
root@lmw-virtual-machine:/home/lmw/MINE/Linux_C_exercise/fork/進程鏈和進程扇# ps
PID TTY TIME CMD
9904 pts/12 00:00:00 su
9905 pts/12 00:00:00 bash
10074 pts/12 00:00:00 ps
root@lmw-virtual-machine:/home/lmw/MINE/Linux_C_exercise/fork/進程鏈和進程扇#
root@lmw-virtual-machine:/home/lmw/MINE/Linux_C_exercise/fork/進程鏈和進程扇# gcc fork_list.c
root@lmw-virtual-machine:/home/lmw/MINE/Linux_C_exercise/fork/進程鏈和進程扇# ./a.out
before fork : pid: 10087, ppid: 9905
pid: 10089, ppid: 10087
pid: 10088, ppid: 10087
pid: 10087, ppid: 9905
pid: 10091, ppid: 10087
pid: 10090, ppid: 10087
pid: 10092, ppid: 10087
^C
root@lmw-virtual-machine:/home/lmw/MINE/Linux_C_exercise/fork/進程鏈和進程扇#
實驗截圖:
分析:
main進程 fork 5 個進程後, 一共就有了6個進程,
這6個進程具體是誰先執行到最後一條printf代碼,這是不一定的,由CPU統一調度。
實驗2
在實驗1的基礎上,修改為:設置main進程是首個執行到最後一條printf語句的進程。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main(){
int i=0;
printf("before fork : pid: %d, ppid: %d\n", \
getpid(), getppid());
for(i=0; i<5; i++){
pid_t pid = fork();
if(pid < 0){
perror("fork ");
}else if(0 == pid){
sleep(3);
break;
}
}
printf("pid: %d, ppid: %d\n", \
getpid(), getppid());
while(1);
return 0;
}
編譯運行:
思路分析:
main進程fork出來的子進程們都會sleep 3 秒, 而main進程只需要飛速執行完畢5次fork(所花時間相對sleep 3秒可以忽略不計), 就可以執行到最後一條printf打印語句。
.