系統編程-進程-進程鏈、進程扇

 

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打印語句。

 

 

 

.