管道pipe是半双工的,pipe两次才能实现全双工,使得代码复杂。socketpair直接就可以实现全双工

socketpair对两个文件描述符中的任何一个都可读和可写,而pipe是一个读,一个写

详间代码:

一:pipe实现父子进程全双工通信:

#include <stdlib.h>
#include <stdio.h>int main ()
{int fd1[2],fd2[2];pipe(fd1);pipe(fd2);if ( fork() ) {/* Parent process: echo client */int val = 0;close( fd1[0] );close(fd2[1]);while ( 1 ) {sleep( 1 );++val;printf( "parent Sending data: %d\n", val );write( fd1[1], &val, sizeof(val) );read( fd2[0], &val, sizeof(val) );printf( "parent Data received: %d\n", val );}}else {/* Child process: echo server */int val ;close( fd1[1] );close(fd2[0]);while ( 1 ) {read( fd1[0], &val, sizeof(val) );printf( "son Data received: %d\n", val );++val;write( fd2[1], &val, sizeof(val) );printf( "son send received: %d\n", val );}}
}

输出结果:parent Sending data: 1

son Data received: 1

son send received: 2

parent Data received: 2

parent Sending data: 3

son Data received: 3

son send received: 4

parent Data received: 4

一:soketpair实现父子进程全双工通信:

#include <sys/types.h>
#include <sys/socket.h>#include <stdlib.h>
#include <stdio.h>int main ()
{int fd[2];int r = socketpair( AF_UNIX, SOCK_STREAM, 0, fd );if ( r < 0 ) {perror( "socketpair()" );exit( 1 );}   if ( fork() ) {/* Parent process: echo client */int val = 0;close( fd[1] );while ( 1 ) {sleep( 1 );++val;printf( "parent Sending data: %d\n", val );write( fd[0], &val, sizeof(val) );read( fd[0], &val, sizeof(val) );printf( "parent Data received: %d\n", val );}}else {/* Child process: echo server */int val ;close( fd[0] );while ( 1 ) {read( fd[1], &val, sizeof(val) );printf( "son Data received: %d\n", val );++val;write( fd[1], &val, sizeof(val) );printf( "son send received: %d\n", val );}}
}

输出结果:parent Sending data: 1

son Data received: 1

son send received: 2

parent Data received: 2

parent Sending data: 3

son Data received: 3

son send received: 4

parent Data received: 4

进程通信:管道(pipe)和socketpair区别相关推荐

  1. 【并发编程三】C++进程通信——管道(pipe)

    [并发编程三]C++实现通信--管道(pipe) 一.管道(pipe) 二.匿名管道 1.简介 2.父子进程:匿名管道的通信过程? 3.相关函数 3.1.创建管道CreatePipe 3.2.写入管道 ...

  2. Linux进程通信-管道

    用户空间进程间通信不可以,如何解决?通过内核空间对象--通信方式 线程间通信?可以在用户空间进行通信,通过全局变量. 线程通信的思路:基于文件io(函数方式不一样) 由此发现,管道通信也如此 通信方式 ...

  3. linux进程通信:pipe实现进程同步

    文章目录 通过管道同步进程 实现代码 管道缓冲区 设置缓冲区大小 总结 :pipe的特点 通过管道同步进程 管道自带同步互斥机制: 管道的内核实现:fs/pipe.c ,主要通过内核的锁以及等待队列等 ...

  4. 进程通信 - 管道通信

      在创建子进程的时候,会将父进程中的资源复制一份给子进程,然后他们各自使用自己的资源,那如果父进程想与子进程通信,如何达到呢,如果说采用套接字的方法,那未免太慢了,是否可以创建一个共同使用的内存,双 ...

  5. C#进程通信 - 管道通信

    语言类型:C# 使用场景:需要使不同进程间可以进行通信 关键代码: #region Pipe/// <summary> G/S:管道接收端 </summary>private ...

  6. NIO详解(十一):线程间通信管道Pipe

    1. 概述 Java NIO 管道是2个线程之间的单向数据连接.Pipe有一个source通道和一个sink通道.数据会被写到sink通道,从source通道读取.下面是Pipe原理的图示: 当有两个 ...

  7. Linux进程通信的四种方式——共享内存、信号量、无名管道、消息队列|实验、代码、分析、总结

    Linux进程通信的四种方式--共享内存.信号量.无名管道.消息队列|实验.代码.分析.总结 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须 ...

  8. Linux 内核、进程调度、进程通信、多线程、协程

    Linux内核 操作系统是什么 内核是什么 从功能层面上来说,内核就是一个中间层,软件和硬件之间交互的中间层,链接层 从其他方面理解内核 系统调用,开放了很多接口:资源管理 内核实现的策略 宏内核 微 ...

  9. php利用socket_pair进程通信,Linux上实现双向进程间通信管道(socketpair)

    管道pipe是半双工的,pipe两次才能实现全双工,使得代码复杂.socketpair直接就可以实现全双工 socketpair对两个文件描述符中的任何一个都可读和可写,而pipe是一个读,一个写 L ...

最新文章

  1. python网站设计开题报告_XX网站设计开题报告范文
  2. 轻松学习Ionic (二) 为Android项目集成Crosswalk(更新官方命令行工具)
  3. linux——(8)数据流重定向、管道命令
  4. 谷歌开发者大会焦点:大中华区新掌门亮相,Android 10原生支持5G,TF2.0大更新...
  5. js数组的定义方法与基本使用
  6. JQuery根据值设置radio选中
  7. 关于IPMI的几个问题
  8. linux优化服务器,Linux服务器优化
  9. 小米球(Ngrok)实现内网穿透,让外网可以进行访问本地部署的 API
  10. 托福试卷真题_托福考试真题 - 韩语自学网
  11. 牛客网--23803--DongDong认亲戚
  12. 1147 简单评委打分
  13. 10_Linux ARM架构-离线部署 Docker + MongoDB-银河麒麟V10操作系统
  14. 操作系统学习笔记——第二章 进程的描述与控制(二)
  15. Mac 不显示未知来源选项的解决办法
  16. 如何下载哨兵1号数据
  17. 八叉树和十六叉树结构
  18. cogs 998. [東方S2] 帕秋莉·诺蕾姬
  19. CSDN图片去水印干货
  20. 华为服务器有海光芯片,刚拿下高通,华为又获得中国电信服务器订单,英特尔急了...

热门文章

  1. c bool类型函数
  2. 每周工作4小时,蒂莫西·费里斯 最理想的工作方式和生活方式,QQ群666243547
  3. 历经22年,我国突破全球首次非人灵长类动物克隆技术,克隆猴已可批量生产...
  4. Qt学习笔记之--Qt内置图标一览表
  5. 牧师与恶魔-智能寻路版
  6. 噩梦系列篇之Player的动画播放控制
  7. 决策树之基尼指数理解
  8. 了解MD5加密算法原理及其应用
  9. MySQL subquery、dependent subquery、uncacheable subquery 是怎么执行的?
  10. 【个人向】编程路的想法愿景