您的位置:首页 > 编程语言 > C语言/C++

C语言进程通过管道同步

2013-08-21 10:10 190 查看
#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<unistd.h>

int main()

{

     int piple_file[2];    //管道文件

     int res,get_data_nu,data;

     res=pipe(piple_file);   //生成管道文件

     if(res==0)

     {

        res=fork();  //创建新进程

        if(-1==res)

        {

            perror("fork failed \n");

            exit(-1);

        }

        if(0==res)  //子进程,子进程是消费者

        {

           int i=0;

           for(i;i<10;i++)

           {

             get_data_nu=read(piple_file[0],&data,sizeof(int)); //往管道中读数据,通过管道为空时等待而使得与父进程同步

             printf("get %d from piple_file0\n",data);

           }

           exit(0);

        }else    //父进程,父进程是生产者

        {

          int i=0;

          for(i;i<10;i++)

          {

            write(piple_file[1],&i,sizeof(int));   //往管道中写数据

            printf("write %d to piple_file[1]\n",i);

            sleep(1);

          }

        }

     }

     exit(0);

}

==============================================================================================

更一般的通过管道通信和同步可以这样:

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<unistd.h>

int main()

{

     pid_t current_pid;

     int piple_file[2];

     int res,get_data_nu,data;

     res=pipe(piple_file);

     if(res==0)

     {

        //sleep(8);

        res=fork();

        if(-1==res)

        {

            perror("fork failed \n");

            exit(-1);

        }

        if(0==res)

        {

           int i=0;

           char buff[BUFSIZ];

           sprintf(buff,"%d",piple_file[0]);    //把fid转换为字符串

           printf("%s the fid is %d\n",buff,piple_file[0]);

           execl("pipe4","pipe4",buff,(char *)0);        //pipe4是一个应用程序

           printf("ok........\n");

           exit(0);

        }else

        {

          int i=0;

          for(i;i<10;i++)

          {

            write(piple_file[1],&i,sizeof(int));

            printf("write %d to piple_file[1]\n",i);

            sleep(1);

          }

        }

     }

     exit(0);

}

===================================pipe4.c=================================

#include<stdio.h>

#include<stdlib.h>

#include<unistd.h>

#include<string.h>

int main(int argc,char * argv[])

{

   int fid,date;

   int i=0;

   printf("Hello ! %s\n",argv[1]);

   sscanf(argv[1],"%d[0-9]",&fid);     //通过转换得到整形的fid号(即管道号)

   printf("the pid is %d\n",fid);

   for(i;i<10;i++)

   {

     read(fid,&date,sizeof(int));   // 从管道中读取数据

     printf("read %d from fid %d\n",date,fid);

   }

   exit(0);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C Ubuntu