前面用 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()出来的位置继续执行,计算后终止进程。