关于进程通信的实例-管道

管道是一种古老的进程间通信机制,分有名管道和无名管道两种数据通信方式。

有名管道是一个可以在文件系统中长期存在的、具有路径名的文件。用系统调用mknod( )建立。它克服无名管道使用上的局限性,可让更多的进程也能利用管道进行通信。因而其它进程可以知道它的存在,并能利用路径名来访问该文件。对有名管道的访问方式与访问其他文件一样,需先用open( )打开。

无名管道是一个临时文件,利用pipe()函数建立起来的无名文件。只有该系统调用所返回的文件描述符来标识该文件。发送进程利用文件系统调用write()来送入管道,结婚搜进程则使用系统调用read()从管道读出消息。这里,管道俺FIFO方式传送消息,且只能单向传送消息。

 

三个子进程和父进程的管道通信。

编写一个程序,建立一个管道。同时,父进程生成子进程P1P2P3,这三个子进程分别向管道中写入消息(消息由键盘输入),父进程将消息读出。

 

 

<code>

include<unistd.h>

#include<signal.h>

#include<stdio.h>

main()

{

   int fd[2],p1,p2,p3;

   char outpipe[100],inpipe[100];

   pipe(fd);                     //创建管道

   while((p1=fork())==-1);        //创建子进程

   if(p1==0)

   {

       lockf(fd[1],1,0);        //锁定管道写入端

       sprintf(outpipe,"child1 is send message!");         //定义发送缓冲区

        write(fd[1],outpipe,50);  //写入管道

       sleep(1);

       lockf(fd[1],0,0);            //释放管道

      exit(0);                //子进程终止

    }

   else

   {

       while((p2=fork())==-1);

        if(p2==0)

       {

           lockf(fd[1],1,0);          //互斥

            sprintf(outpipe,"child2 is send message!");

           write(fd[1],outpipe,50);

            sleep(1);

            lockf(fd[1],0,0);

            exit(0);

       }

        else

        {

           while((p3=fork())==-1);

           if(p3==0)

           {

              lockf(fd[1],1,0);

              sprintf(outpipe,"child3 is send message!");

              write(fd[1],outpipe,50);

              sleep(1);

              lockf(fd[1],0,0);

              exit(0);

           }

            else

           {

              wait(0);           //同步 等待子进程终止

              read(fd[0],inpipe,50);

                printf("%s/n",inpipe);

              wait(0);           //同步 等待子进程终止

              read(fd[0],inpipe,50);

                printf("%s/n",inpipe);

              wait(0);           //同步 等待子进程终止

              read(fd[0],inpipe,50);

                printf("%s/n",inpipe);

                exit(0);

           }

         }

     }

}

运行结果:

 

 

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值