Linux 进程间通讯方式 pipe()函数 (转载)
转自:http://blog.csdn.net/ta893115871/article/details/7478779
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 进程间通讯
一.Linux 下进程间通讯方式 1)管道(Pipe)及有名管道(named pipe): 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允 ...
- 鸿蒙内核源码分析(进程通讯篇) | 九种进程间通讯方式速揽 | 百篇博客分析OpenHarmony源码 | v28.03
百篇博客系列篇.本篇为: v28.xx 鸿蒙内核源码分析(进程通讯篇) | 九种进程间通讯方式速揽 | 51.c.h .o 进程通讯相关篇为: v26.xx 鸿蒙内核源码分析(自旋锁篇) | 自旋锁当 ...
- Android 进程间通讯方式
Android 进程间通讯方式 1.通过单向数据管道传递数据 管道(使用PipedWriter/ 创建PipedReader)是java.io包的一部分.也就是说,它们是一般的Java功能,而不是An ...
- Linux进程间通讯的几种方式的特点和优缺点,和适用场合
http://blog.csdn.net/jeffcjl/article/details/5523569 由于不同的进程运行在各自不同的内存空间中.一方对于变量的修改另一方是无法感知的.因此.进程之间 ...
- linux进程间通讯的几种方式的特点和优缺点
# 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父子进程关系.# 有名管道 (named pipe) : 有名管道也是 ...
- Linux 进程间通讯详解一
进程间的通讯 两台主机间的进程通讯 --socket 一台主机间的进程通讯 --管道(匿名管道,有名管道) --System V进程间通信(IPC)包括System V消息队列,System V信号量 ...
- Linux 进程间通讯详解二
消息队列 --消息队列提供了本机上从一个进程向另外一个进程发送一块数据的方法 --每个数据块都被认为有一个类型,接收者进程接收的数据块可以有不同的类型值 --消息队列也有管道一样的不足,就是每个消息的 ...
- linux进程间通讯-System V IPC 信号量
进程间通信的机制--信号量.注意请不要把它与之前所说的信号混淆起来,信号与信号量是不同的两种事物.有关信号的很多其它内容,能够阅读我的还有一篇文章:Linux进程间通信--使用信号.以下就进入信号量的 ...
- 进程间通讯-2(pipe)
通过pipe 管道的方式也可以实现进程间通信. 父进程和子进程之间可以实现相互通信. from multiprocessing import Process, Pipe def f(conn): co ...
随机推荐
- jmeter接口测试实战简例
1.接口需求文档说明 2.打开jmeter,新建线程组,线程组里面默认配置就可以 3.建立http请求,我这里是http请求,所以我选择这个,跟进实际情况 4.post请求说明,post直接加参数和参 ...
- HDU-1272小希的迷宫,并查集?其实不用并查集;
小希的迷宫 ...
- noip模拟赛 少女
分析:每个连通块都是独立的,对一个连通块进行分析.如果边数>点数,显然是不可能的,因为每条边要分配给一个点,至少有一个点分配了两次以上.如果边数=点数,就形成了环,有两种方案,顺时针一个环,逆时 ...
- 【HDOJ6148】Valley Numer(数位DP)
题意: 1≤T≤200 ● 1≤length(N)≤100 思路: 设f[i,j,k,l]为第i位为j,前i位是否贴上限(0/1),递减或递增(0/1)方案数 g[i,j,k]为不到n位,第i位为j, ...
- c#中的委托和事件详细学习【分6页学习】
原文发布时间为:2008-11-01 -- 来源于本人的百度文章 [由搬家工具导入] 在本文中我首先通过一个GreetingPeople的小程序向大家介绍了委托的概念、委托用来做什么,随后又引出了事件 ...
- 在 Windows 10 64 下安装 Memcached,安装 PHP 7.0.22 的 Memcache 扩展
1.之前写过一篇在 PHP 5.6.27 下的博客:http://www.shuijingwanwq.com/2017/09/11/1892/ ,此次是 PHP 7.0.22 下的,如图1 图1 2. ...
- HDU 5640 King's Cake【模拟】
题意: 给定长方形,每次从中切去一个最大的正方形,问最终可以得到多少正方形. 分析: 过程类似求gcd,每次减去最小的边即可. 代码: #include <cstdio> #include ...
- MongoDB小结09 - update【定位修改器】
如果要操作数组中的值,可以用值在数组中的位置当做参数来删除 db.user.update({"name":"codingwhy.com"},{"$se ...
- jQuery—— jQuery get方法+一般处理程序处理文本框内容
网上常常看到这种交互方式,当去一个站点注冊username的时候,假设文本框内没有输入数据,或者数据输入的内容格式不正确.就会将文本框变成红色来提示你输入的内容有误. 自己将这个文本框验证的方式改变了 ...
- poj 3233(矩阵高速幂)
题目链接:http://poj.org/problem?id=3233. 题意:给出一个公式求这个式子模m的解: 分析:本题就是给的矩阵,所以非常显然是矩阵高速幂,但有一点.本题k的值非常大.所以要用 ...