综合:
建立两个子进程:
一个负责计算1-50000的素数
另外一个负责计算50001-100000
父进程负责存储
利用fork创建两个子进程的框架:
#include
#include
#include
void main()
{
int id = 1;
while(1)
{
if(fork())
{
if(id>2) //循环创建两个子进程
{
break;
}
continue;
}
else
{
//子进程
while(1)
{
//子进程处理
}
exit(0); //子进程处理完就退出,父进程处理不会影响子进程
}
}
//以下父进程处理
}
注:此创建两个子进程的框架、只是两个子进程处理相同的问题。
程序代码:
#include
#include
#include
#include
#include
#include
#include
intidx=0;
intfddata;
voidhandle(int s)
{
int status;
if(s==SIGCHLD)
{
wait(&status);
idx++;
if(idx==2)
{
close(fddata);
printf("任务完成\n");
exit(-1);
}
}
}
intisprimer(int ta)
{
int i=2;
for(;i
{
if(ta%i==0)
{
return 0;
}
}
return 1;
}
main()
{
int a,b;
int id=1;
int fd[2];
signal(SIGCHLD,handle);
pipe(fd);
while(1)
{
if(id==1){
a=2;b=50000;
}
if(id==2){
a=50001;b=100000;
}
if(fork()){
id++;
if(id>2){
break;
}
continue;
}
else{
//子进程
int i;
close(fd[0]);
for(i=a;i<=b;i++)
{
if(isprimer(i))
{
write(fd[1],&i,sizeof(int));
}
sched_yield();
}
printf("%d任务完成!\n",getpid());
exit(0);
}
}
int re;
char buf[20];
//打开文件,准备存储
close(fd[1]);
fddata=open("result.txt",
O_RDWR|O_CREAT,0666);
while(1)
{
read(fd[0],&re,sizeof(int));
sprintf(buf,"%d\n",re);
write(fddata,buf,strlen(buf));
sched_yield();
}
}
注:sched_yield()函数—让出cpu,让其他进程先执行。
SIGCHLD 子进程结束后系统向父进程发送的信号,告诉父进程,子进程已经结束。