Linux系统编程37 进程控制 - 进程分配之交叉分配法

前面用 N 个进程 计算N个自然数 是否为质数,这种方法是存在缺陷的,如果N数值很大,那么就不是很现实。

所以可以考虑 进程的交叉分配法 实现计算,如下,父进程 fork() 3个子进程,用3个子进程 分别计算N个自然数

进程的交叉分配法 实现 查找质数

#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/wait.h>

#define LEFT 200
#define RIGHT 250
#define N 3


int main(void)
{
	int i,j,mark,n;
	pid_t pid;
	
	for(n = 0; n < N; n++)
	{
		pid = fork();
		if(pid < 0)
		{
			fprintf(stderr,"fork() failed!\n");
			exit(1);
		}
		else if(pid == 0)//child
		{
			
			for(i = LEFT+n; i <= RIGHT; i+=N)
			{
				mark = 1;
				for(j = 2; j < i/2; j++)
				{
					if(i % j ==0)
					{
						mark = 0;
						break;
					}
			
				}

				if(mark)
					printf("[%d]%d is a primer\n",n,i);
			}

			exit(0);//!!!
		}
		
	}

	for(n = 0;n < N; n++)
		wait(NULL);

	exit(0);
}




mhr@ubuntu:~/Desktop/xitongbiancheng/test$ gcc test.c 
mhr@ubuntu:~/Desktop/xitongbiancheng/test$ 
mhr@ubuntu:~/Desktop/xitongbiancheng/test$ ./a.out 
[2]211 is a primer
[2]223 is a primer
[2]229 is a primer
[2]241 is a primer
[0]227 is a primer
[0]233 is a primer
[0]239 is a primer
mhr@ubuntu:~/Desktop/xitongbiancheng/test$ 

结果可知 0号进程和 2号进程 分别拿到了几个质数, 乱序是因为进程调度问题

父进程连续fork() 三个子进程,后等待子进程终止释放资源。3个子进程从各自被fork()出来的位置继续执行,计算后终止进程。

猜你喜欢

转载自blog.csdn.net/LinuxArmbiggod/article/details/113795423