系统编程-进程-进程链、进程扇

2021-03-03

 

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

 

 

 

.