使用管道实现两个进程之间的通信
2016-06-28 20:41
681 查看
今天学到管道的使用,感觉挺简单的,自己实际写了下,深陷逻辑中不能自拔。
现有进程a和进程b,管道单向传输数据,两个进程链接两个管道实现初级同步。
一个进程打开管道的读,另一个进程就打开管道的写。
进程a:
进程b:
注意进程中打开管道的顺序必须是成对的,即是对于同一个管道,a进程是写
操作,b进程在和a同样的执行顺序下执行读操作。不然就会循环等待,接受不
到对方的信息。
为了实现双方的实时通信,需要使用 I/O多路转接模型,使用select函数,使用的头文件
sys/types.h sys/time.h unistd.h
函数的原型是 int select(int nfds,fd_set *readfds,fd_set *writefds,fd_set *exceptfds
,struct timeval *timeout)
进程a:
进程b:
**此处小心**fd_set是文件控制符的集合,需要自己创建。最后在这个实例中,实现进程的通信,
需要监听writre,即时标准输入stdin(STDIN_FILENO)。
本人知识有限,不足之处还请指出。
现有进程a和进程b,管道单向传输数据,两个进程链接两个管道实现初级同步。
一个进程打开管道的读,另一个进程就打开管道的写。
进程a:
int fdr=open("1",O_RDONLY); if(-1 == fdr) { perror("open dr"); return -1; } int fdw=open("2",O_WRONLY); if(-1 == fdw) { perror("open dw"); return -1; }
进程b:
int fdw=open("1",O_WRONLY); if(-1 == fdw) { perror("open dw"); return -1; } int fdr=open("2",O_RDONLY); if(-1 == fdr) { perror("open dr"); return -1; }
注意进程中打开管道的顺序必须是成对的,即是对于同一个管道,a进程是写
操作,b进程在和a同样的执行顺序下执行读操作。不然就会循环等待,接受不
到对方的信息。
为了实现双方的实时通信,需要使用 I/O多路转接模型,使用select函数,使用的头文件
sys/types.h sys/time.h unistd.h
函数的原型是 int select(int nfds,fd_set *readfds,fd_set *writefds,fd_set *exceptfds
,struct timeval *timeout)
进程a:
fd_set set; while(1) { FD_ZERO(&set); FD_SET(fdr,&set); FD_SET(0,&set); memset(buff,0,sizeof(buff)); int ret=select(fdr+1,&set,NULL,NULL,NULL); if(FD_ISSET(fdr,&set)) { read(fdr,buff,sizeof(buff)); puts(buff); } if(FD_ISSET(0,&set)) { read(0,buff,sizeof(buff)); // scanf("%s",buff); write(fdw,buff,strlen(buff)-1); } } close(fdr); close(fdw);
进程b:
fd_set set; while(1) { FD_ZERO(&set); FD_SET(fdr,&set); FD_SET(0,&set); memset(buff,0,sizeof(buff)); int ret=select(fdr+1,&set,NULL,NULL,NULL); if(FD_ISSET(0,&set)) { read(0,buff,sizeof(buff)); // scanf("%s",buff); write(fdw,buff,strlen(buff)-1); } if(FD_ISSET(fdr,&set)) { read(fdr,buff,sizeof(buff)); puts(buff); } } close(fdr); close(fdw);
**此处小心**fd_set是文件控制符的集合,需要自己创建。最后在这个实例中,实现进程的通信,
需要监听writre,即时标准输入stdin(STDIN_FILENO)。
本人知识有限,不足之处还请指出。
相关文章推荐
- Ubuntu 默认壁纸历代记
- Ubuntu Remix Cinnamon 20.04 评测:Ubuntu 与 Cinnamon 的完美融合
- 关于Ubuntu 11.10启动提示waiting for the network configuration的问题
- 在 Ubuntu 桌面中使用文件和文件夹
- ubuntu下chrome无法同步问题解决
- Ubuntu Linux使用体验
- 使用 GNOME 优化工具自定义 Linux 桌面的 10 种方法
- 以Ubuntu 9.04为例 将工作环境迁移到 Linux
- VirtualBox虚拟机XP与宿主机Ubuntu互访共享文件夹
- 从USB安装Ubuntu Server 10.04.3 图文详解
- Ubuntu 15.04 正式版发布下载
- Linux-Ubuntu 10.04安装Cadence-ic610 方法总结图解
- Ubuntu 12.04和Windows 7双系统安装图解
- Ubuntu /home下中文目录如何修改成英文?
- 开机出现:grub rescue的修复方法
- Ubuntu连接Android真机调试
- 你应该选择 Ubuntu 还是 Fedora?
- 100 个最佳 Ubuntu 应用(中)
- 看看我的Ubuntu Linux截图
- Ubuntu 12.04 LTS服务器版安装过程及使用图解