Linux 进程间通讯方式 pipe()函数
来源:互联网 发布:王者荣耀李白铭文知乎 编辑:程序博客网 时间:2024/05/22 03:09
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进程间通讯方式之管道pipe
- Linux进程间通讯一--无名管道PIPE
- linux 进程间通讯方式
- 进程间相互通信(pipe方式)
- linux 进程通讯方式
- 通过 Named Pipe 实现进程间通讯
- Linux进程间通信方式之管道(pipe)
- Linux进程间通信方式之管道(pipe)
- Linux进程间通信方式之管道(pipe)
- Linux 进程间通讯(IPC)方式 ------- 共享内存
- Linux 进程间通讯之信号方式
- Linux 进程间通讯之信号方式
- Linux—进程间通讯方式总结
- 进程间通信-pipe函数
- Linux下进程间通信:管道-pipe函数
- Linux下进程间通信:管道-pipe函数
- Linux下进程间通信:管道-pipe函数
- 零零散散学算法之详解几种最短路径
- DP_poj1887_Testing the CATCHER
- 转自MBA lib 时间管理
- 四种调用模式之函数调用模式
- 求最长公共子串问题
- Linux 进程间通讯方式 pipe()函数
- 计算机组成原理小结
- 无线路由的信道,应选哪个?
- 类模板中的友元
- Unable to instantiate Action
- 暗时间-如何有效的记忆和学习
- 设计模式之八 --- 装饰模式(Decorator)
- js关闭窗口 ie ff chrome
- ZFS源代码之旅——ZAP模块分析(二)