现在的位置: 首页 > 综合 > 正文

Linux c 匿名管道实例—创建两个子进程与父进程进行管道通信

2017年12月14日 ⁄ 综合 ⁄ 共 2487字 ⁄ 字号 评论关闭

综合:

              建立两个子进程:

                     一个负责计算1-50000的素数

                     另外一个负责计算50001-100000

                     父进程负责存储

 

利用fork创建两个子进程的框架:

#include<stdio.h>

#include<stdlib.h>

#include<unistd.h>

 

void  main()

{

int   id = 1;

while(1)

{

    if(fork())

    {

         if(id>2)           //循环创建两个子进程

         {

                break;

         }

        continue;

    }

    else

    {

           //子进程

          while(1)

           {

               //子进程处理

           }

          exit(0);      //子进程处理完就退出,父进程处理不会影响子进程

    }

}

 

 

//以下父进程处理

 

 

}

注:此创建两个子进程的框架、只是两个子进程处理相同的问题。

 

 

 

程序代码:

 

 

#include<stdio.h>

#include<unistd.h>

#include<fcntl.h>

#include<signal.h>

#include<stdlib.h>

#include<string.h>

#include<sched.h>

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<ta;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 子进程结束后系统向父进程发送的信号,告诉父进程,子进程已经结束。

抱歉!评论已关闭.