进程通讯(二)--无名管道

18 篇文章 0 订阅
17 篇文章 0 订阅
 无名管道是父子进程间的通讯。无名的管道创建使用完全是在内存中。甚至连有名管道要创建的管道文件都没有。
   有名管道的管道文件虽然没有大小,但好歹磁盘中有个标记,可以被需通讯的进程们看到共同使用。而无名管道的管道完全隐藏在一个程序的代码中,在进程运行时创建销毁,正是因为这个特点,所以限制了通讯的范围。
   无名管道创建打开的函数 
   int pipe(int fd[2]);
   参数其实已经退化为指针了,之所以写2是为了明显的表示函数只需要自己定义的fd数组中的前两项。
   创建成功返回0,失败返回-1
  fd[0]控制读权限  
  fd[1]控制写权限
    read(fd[0],buff,size);
  写  write(fd[1],buff,len);
  关闭   close(fd[0])  close(fd[1])
   值得注意的是,进程通讯为了保证数据的安全完整读写,要求半双工,即父进程只写或只读,子进程对应相应的读或写,由于fork出的子进程和其父进程都拥有fd[0]和f[1],因此需要在fork后执行通讯前的第一件事是关闭其中一个权限f[0]或f[1]。
  纯文字还是不够直观,简单的举个栗子
  进程创建子进程,这俩个进程实现这样一种通讯,即父进程输入单词,子进程读单词,直到父进程输入了end,进程结束。
  


可以看到在父子进程的if else 分别对应的代码块的第一句就是先关闭了非自己应有的权限。最后才是关闭了自己本身的权限。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值