Linux 进程间通讯方式 pipe()函数
Linux 进程间通讯方式有以下几种:
1-》管道(pipe)和有名管道(fifo).
2-》消息队列
3-》共享内存
4-》信号量
5-》信号(signal)
6-》套接字(sicket)
在这里我们看一下第一种====管道(pipe)。有名管道(fifo)见其它文章。
eg :我们以前学的命令 cat file | grep "abc" > file2
在我看来 我们把cat 读取file中的内容读到内存在通过过滤命令grep 过滤出包含"abc"的记录 再输出重定向到文件file2
在这个过程中 我们把cat file | grep "abc"的输出内容作为 > 的输入内容。
在Linux系统中,管道通信可以通过使用系统调用来实现。
使用格式为:
#include<unistd.h>
int pipe(int fd[2]);
功能: 创建一个简单的管道,若成功则为数组fd分配两个文件描述符,其中fd[0] 用于读取管道,fd[1]用于写入管道。
返回:成功返回0,失败返回-1;
管道,顾名思义,当我们希望将两个进程的数据连接起来的时候就可以使用它,从而将一个进程的输出数据作为另一个进程的输入数据达到
通信交流的目的。
但值得我们注意的是:管道它有自身的特点。
(1)管道通信是单向的,并且遵守先进先出的原则,即先写入的数据先读出。
(2)管道是一个无结构,无固定大小的字节流。
(3) 管道把一个进程的标准输出和另一个进程的标准输入连接在一起。数据读出后就意味着从管道中移走了,消失了。其它的进程都不能
再读到这些数据。就像我们平常见到的管子水流走了就没有了。 这点很重要!!
(4) pipe这种管道用于两个有亲缘关系的进程之间。eg:父子进程......
好了,废话不多说了,下面我们看个例子:come on
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<wait.h>
#include<sys/types.h>
int main(int argc ,char *argv[])
{
int pipefd[2],result;
char buf[1024];
int flag=0;
pid_t pid;
result= pipe(pipefd);//创建一个管道
if(result==-1){
perror("pipe error:");
exit(EXIT_FAILURE);
}
pid=fork();//创建一个子进程
if(pid==-1)
{
perror("fork error:");
exit(EXIT_FAILURE);
}
else if(pid==0){
if((close(pipefd[1]))==-1)//close write only read
{
perror("close write error:");
exit(EXIT_FAILURE);
}
while(1){ //循环读取数据
read(pipefd[0],buf,1024);//最多读取1024个字节
printf("read from pipe : %s\n",buf);
if(strcmp(buf,"exit")==0){// if 读取到的字符串是exit 这是
//父进程会接受到一个终止进程的信号,父进程会回收子进程的资 // 源等
exit(EXIT_SUCCESS);
}
}
}else{
//close read only write
if((close(pipefd[0]))==-1){
perror("close read error:");
exit(EXIT_FAILURE);
}
while(1)//循环写入内容
{
waitpid(pid,NULL,WNOHANG);//等待子进程退出
if(flag==1)
exit(0);
scanf("%s",buf);
write(pipefd[1],buf,strlen(buf)+1);//具体写多少个字节
if(strcmp(buf,"exit")==0){
flag=1;
sleep(1);//让子进程完全退出。
}
}
}
return 1;
}
此程序代码中都有注释,在这里就不废话了。
运行结果为:
当我们键入exit时 父子进程都退出。
此时我们可以用ps -aux进行查看。
Linux 进程间通讯方式 pipe()函数相关推荐
- Linux 进程间通讯(IPC)方式 ------- 共享内存
Linux 进程间通讯(IPC)方式有以下几种: 1->管道(pipe)和有名管道(fifo). 2->消息队列 3->共享内存 4->信号量 5->信号(signal) ...
- linux无名管道实验代码,Linux 进程间通讯之创建无名管道和读写无名管道
Linux进程间通讯的方式: 1. 管道(pipe)和有名管道(FIFO). 2. 信号(signal) 3. 消息队列 4. 共享内存 5. 信号量 6. 套接字(socket) 管道通讯: 无名管 ...
- iOS进程间通讯方式
iOS 进程间通讯方式: 解释 URL Scheme 这个是iOS app通信最常用到的通信方式,App1通过openURL的方法跳转到App2,并且在URL中带上想要的参数,有点类似http的get ...
- linux进程间通讯的几种方式的特点和优缺点,和适用场合。
http://blog.csdn.net/kakaka2011/article/details/6636661 1. 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有 ...
- linux命名管道进程间通信,Linux进程间通讯--命名管道
IPC安全 前面总结了匿名管道,如今来看命名管道:因为匿名管道的一个限制就是:只能是有血缘关系的进程间才能够通讯,好比:有两个同祖先的子进程,父子进程等:为了突破这一个限制,想让没有任何关系的两个进程 ...
- linux进程间通讯-有名管道
文章目录 阻塞和非阻塞概念 通过fcntl函数设置文件的阻塞特性 文件描述符概述 文件描述符的复制 有名管道 有名管道的创建 有名管道的基本读写操作 有名管道实现进程间通信 有名管道的读写规律(阻塞) ...
- java进程间通讯方式有哪些_java 进程间通讯的有几种方法?
展开全部 进程间通信的方法主要有以下几种: (1)管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另32313133353236313431303231363533e78988e6 ...
- linux进程间通讯-信号
文章目录 进程间通信功能 信号 信号的概念 产生信号的方式 信号的默认(缺省)处理方式 进程接收到信号后的处理方式 kill函数 alarm函数 raise函数 abort函数 pause函数 sig ...
- linux进程间通讯-无名管道
文章目录 无名管道 无名管道的创建 -- pipe函数 无名管道的读写规律 无名管道 无名管道概述 管道(pipe)又称无名管道. 无名管道是一种特殊类型的文件,在应用层体现为两个打开的文件描述符.任 ...
最新文章
- NullPointerException异常的原因及java异常??
- vue 访问 const 变量_var与let、const的区别
- 在html用div怎样写页脚,使用div+CSS将页脚始终控制在页面最下方的方法
- php pecl memcached,php – 安装PECL Memcached错误
- 剑指offer 二叉搜索树的后序遍历
- 如何改变请求的host以及referer抓取做了host以及referer限制的接口数据
- java使用xml存储数据_用存储过程和 JAVA 写报表数据源有什么弊端?
- 12v小型电机型号大全_电动机型号参数大全,再也不怕看不懂电机型号了
- 转正答辩ppt_如何顺利完成转正答辩?
- 算法题:括号匹配(小中大括号序列)
- scratch转flash、exe教程
- 怎样下载安装Firebug和使用Firebug
- 考研日记2021年9月16日
- 无人机飞控 ardupilot Copter-4.0.7 库示例
- 3dmax制作三维地形图
- 仿网易新闻的首页+QQ的侧滑菜单栏
- springboot毕设项目创新创业管理系统1f90r(java+VUE+Mybatis+Maven+Mysql)
- 度小满金融2019年春招笔试题(研发岗)
- 数字基带信号(主要涉及基带编码、传输系统)
- 区块链联盟的正确方式
热门文章
- [postgresql]postgresql自定义函数查询ETL作业依赖的实例
- [linux] redhat 7 ssh 安装配置免密登录
- C语言基础:for循环演示源码,字符循环和浮点数循环
- PythonTip(1)
- Python之路【第六篇】:Python运算符
- Oracle 数据块损坏与恢复具体解释
- 使用JUnit-4.11报java.lang.NoClassDefFoundError:
- Android 学习资源收集
- Kaldi AMI数据集脚本学习2----run_prepare_shared.sh
- django 业务代码写哪儿_测试人员快速上手Django指南