进程间通讯-——管道
来源:互联网 发布:openwrt 挂载网络磁盘 编辑:程序博客网 时间:2024/06/01 13:26
进程间通讯:多个进程间数据变换。
通讯方式:信号、管道、信号量、消息队列、共享内存、套接字
这里我要讲的是管道,管道分为半双工通讯、全双工通讯。如果要举例说明的话,半双工通讯就类似自来水管,全双工通讯就类似我们打电话。下面我先用画图解释一下管道的原理:
管道不对数据流向做规定,因此为防止进程A读取自己写入的数据(没有意义)采用半双工通讯。
管道操作如下:
一、有名管道:在文件目录树下有一个文件标识(管道文件),不占据磁盘空间,只有一个inode结点,数据缓存在内存上(有大小
限制)。有名管道应用于任意两个进程之间数据的单向传递。
优点:可以在任意两进程间完成通讯。
1、创建:命令方式:mkfifo; 函数方式:mkfifo();
打开:open();
写数据:write();
读数据:read();
关闭:close();
2、阻塞运行函数:函数调用以后并不会立即返回,需要等待某些条件的发生才会返回。例如,open()操作管道文件时,阻塞运行的
函数。通俗的来讲就是open函数阻塞运行,当有人读管道才有存在意义。
如果一个进程以只写方式打开一个管道文件,open会阻塞运行,直到有一个进程以只读方式打开管道文件,open才会返回,进程
才会接着执行;
如果一个进程以只读方式打开一个管道文件,open会阻塞运行,直到有一个进程以只写方式打开管道文件,open才会返回,进程
才会接着执行。
read函数也会阻塞运行,直到写端写入数据或者所有的写端都关闭。read()读取数据并且会将内存上的已读数据清空。
二、无名管道:相对于有名管道而言,无名管道在使用时产生,不使用后释放,并且不会在系统上留下任何“痕迹”。
无名管道因其使用前没有任何的提示,所以它只能应用于父子进程之间。因为子进程会完全复制父进程的文件数组。(浅拷贝)
1、创建、打开:int pipe(int da[2]); // fd[0]读;fd[1]写;
2、读:read(fd[0],buff,size);
3、写:write(fd[1],buff,len);
4、关闭:close(fd[0]); close(fd[1]);
注意:管道都是半双工通讯,而无名管道创建后,父进程在fork产生子进程后两个进程分别有一对读写,所以,要在父子进程分别关
闭或写。就是只保留一对读写,分别存在于父子进程。
阅读全文
0 0
- 进程间通讯—管道
- 进程间通讯——有名管道
- 进程间通讯-——管道
- 进程间通讯——无名管道
- 进程间通讯——管道(有名管道)
- 进程间通讯--管道
- 进程间通讯:管道
- 进程间通讯--管道
- Linux—进程间通讯—无名管道
- linux——进程间通讯(管道)
- 进程间通讯(3)—信号量&管道
- Linux进程间通讯--管道(有名管道
- 管道实现进程间通讯
- 管道实现进程间通讯
- 管道实现进程间通讯
- 进程间通讯---匿名管道
- linux进程间通讯--管道
- Linux-进程间通讯-管道
- 运行时常用的功能
- 一些被忽略且好用的API
- dex文件格式——思维导图
- kong API gateway(二):添加API
- Matlab 方程组求解
- 进程间通讯-——管道
- 游戏化学习
- Kylin增量cube build的restAPI的时间不准确的BUG
- TCP Connection Establishment Process: The "Three-Way Handshake"
- 小米4A安装App报错INSTALL_FAILED_VERSION_DOWNGRADE
- Java-JDK-Serializable
- Ubuntu下Qt creator无法使用fcitx输入中文之解决办法
- I2C 上拉电阻取值
- 001-javaweb项目各个目录的作用