linux----------2--3----(无名)管道通信原理及管道编程实战

IPC的方式通常有管道(无名管道和命名管道),消息队列,信号量,共享存储,socket,streams等,其中socket和streams支持以不同主机上的两个进程IPC。(笔试题或面试可能会考,记住)

管道:(无名管道)

1.特点:

a 它是半双工的(数据只能在是单向的,只能一个写一个读,管道读走就没了),具有固定的读端和写端

 b他是能用于具有亲属关系的进程之间的通信(父子进程或兄弟进程)

 c 一种特殊的文件,只存于内存中,之建立在通信当中,父进程或子进程退出,管道消失,

管道是基于文件描述符的通信方式。当一个管道建立时,它会创建两个文件描述符fd[0]和fd[1]。其中fd[0]固定用于读管道,而fd[1]固定用于写管道。

原型:

 

 

1)父进程创建管道,得到两个⽂件描述符指向管道的两端

(2)父进程fork出子进程,⼦进程也有两个⽂件描述符指向同⼀管道。

(3)父进程关闭fd[0],子进程关闭fd[1],即⽗进程关闭管道读端,⼦进程关闭管道写端(因为管道只支持单向通信)。⽗进程可以往管道⾥写,⼦进程可以从管道⾥读,管道是⽤环形队列实现的,数据从写端流⼊从读端流出,这样就实现了进程间通信。
————————————————
本文为CSDN博主「木下 似水」的原创文章

返回值为-1,创建管道失败       为0 ,创建成功

int main(){
                                        // int pipe(int pipefd[2]);
  int fd[2];   //  promole
  pid_t pyd;
   char buf[128];
  pipe(fd);
  if(pipe(fd)==-1){
           printf("creat pipe  error!\n");
          }
     pyd=fork();                                   //pid_t fork(void);
  if(pyd<0){
            printf("creat   fork  error!\n");
            }
 else if(pyd>0){
              printf("the  is  father fork\n");
                   close(fd[0]);
   write(fd[1],"pengyuandan hard success",strlen("pengyuandan hard success"));
                wait();
                 }
 else{
         printf("the is chile fork\n");
         close(fd[1]);
         read(fd[0],buf,128);
   printf("buf byte= %d ,buf data=%s\n",strlen(buf),buf);
            exit(0);
         }

      //   ssize_t read(int fd, void *buf, size_t count);
     //  ssize_t write(int fd, const void *buf, size_t count);
return 0;
}

运行结果为

the  is  father fork
the is chile fork
buf byte= 25 ,buf data=pengyuandan hard successv

也可以在父进程中加入sleep();等待子先写,当是子进程没有写入的内容,所以会出现堵塞

因为父子进程共用一个管道,所以父进程写入,子进程可以读出

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追着希望跑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值