Linux进程间通信之管道
1,进程间通信 (IPC ) Inter-Process Communication
比较好理解概念的就是进程间通信就是在不同进程之间传播或交换信息。
2,linux下IPC机制的分类:管道、信号、共享内存、消息队列、信号量、套接字
3,这篇主要说说管道:本质是文件,其他理论什么的网上已经有一大堆了,我就只写一点用法吧。
3.1 特点
1)管道是最古老的IPC,但目前很少使用
2)以文件做交互的媒介,管道分为有名管道和无名管道
3)历史上的管道通常是指半双工管道
3.2 管道:有两种形式,命令行和非命令行
(1)命令行:
mkfifo testfifo
echo "testfifo" >fifo
cat fifo

(2)非命令行:这里又分有名管道和无名管道
编程模型:进程A创建管道(mkfifo) -> 进程A写打开管道(open) -> 进程B读打开管道(open) -> 进程A开始往管道里写数据(write) ->
进程B从管道中读数据(read) -> 进程A关闭管道(close) -> 进程B关闭管道(close) -> 删除管道(unlink)
有名管道(实例):
进程A:
#include<sys/stat.h>
#include<fcntl.h>
#include<stdio.h> #define PIPENAME "pipetest" int main()
{
// 创建管道
if(mkfifo(PIPENAME, ) < )
{
perror("mkfifo");
return -;
} // 写打开管道
int fd = open(PIPENAME, O_WRONLY);
if(- == fd)
{
perror("open");
return -;
} unlink(PIPENAME); int i = ;
for(i = ; i < ; i++)
{
write(fd, &i, sizeof(i));
printf("%d\n", i);
sleep(); // 这个是以秒为单位挂起
} // 关闭管道
close(fd); return ; }
进程B:
#include<sys/stat.h>
#include<fcntl.h>
#include<stdio.h> #define PIPENAME "pipetest" int main()
{
// 读打开管道
int fd = open(PIPENAME, O_RDONLY);
if(- == fd)
{
perror("open");
return -;
} int num = ;
int i = ;
for(i = ; i < ; i++)
{
read(fd, &num, sizeof(int));
printf("%d\n", num);
fflush(stdout); // 强制刷新输出缓冲区
} printf("\n");
close(fd); return ; }
运行效果如下:

开另外一个终端,运行读进程

无名管道:适用于父子进程之间的通信
int pipe(int pipefd[2]):该函数在内核中创建管道文件,通过输出参数pipefd返回两个文件描述符,其中pipefd[0]用于读,pipefd[1]用于写。
注意:
写数据的进程关闭读端pipefd[0]
读数据的进程关闭写端pipefd[1]
实例:
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<stdlib.h> int main()
{
int fd[]; // 用来保存文件描述符
pipe(fd); pid_t pid = fork();// 创建进程
if(pid > )
{
// 父进程写管道,需要关闭读端
close(fd[]);
int i = ;
for(i=; i<; i++)
{
write(fd[], &i, sizeof(int));
sleep();
} close(fd[]);// 关闭写端
exit();
} // 子进程读管道
close(fd[]); // 先关闭写端
int x;
int i = ;
for(; i<; i++)
{
read(fd[], &x, sizeof(int));
printf("%d ", x);
setbuf(stdout, NULL);
}
close(fd[]);
printf("\n"); return ;
}
运行效果如下:
Linux进程间通信之管道的更多相关文章
- Linux 进程间通信(二) 管道
Linux 进程间通信-管道 进程是一个独立的资源分配单位,不同进程之间的资源是相互独立的,没有关联,不能在一个进程中直接访问另一个进程中的资源.但是,进程不是孤立的,不同的进程之间需要信息的交换以及 ...
- Linux进程间通信之管道(pipe)、命名管道(FIFO)与信号(Signal)
整理自网络 Unix IPC包括:管道(pipe).命名管道(FIFO)与信号(Signal) 管道(pipe) 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道 ...
- Linux进程间通信(一) - 管道
管道(pipe) 普通的Linux shell都允许重定向,而重定向使用的就是管道. 例如:ps | grep vsftpd .管道是单向的.先进先出的.无结构的.固定大小的字节流,它把一个进程的标准 ...
- Linux -- 进程间通信之管道
管道是 Linux 里的一种文件类型,同时也是 Linux 系统下进程间通信的一种方式 创建一个管道文件有两种方式: Shell 下命令 mkfifo + filename,即创建一个有名管道 ...
- linux进程间通信-有名管道(FIFO)
有名管道(FIFO) 命名管道也被称为FIFO文件,是一种特殊的文件.由于linux所有的事物都可以被视为文件,所以对命名管道的使用也就变得与文件操作非常统一. (1)创建命名管道 用如下两个函数中的 ...
- Linux进程间通信-命名管道
前面我们讲了进程间通信的一种方式,匿名管道.我们知道,匿名管道只能用于父子关系的进程之间.那么没有这种关系的进程之间该如何进行数据传递呢? 1.什么是命名管道 匿名管道是在缓存中开辟的输出和输入文件流 ...
- Linux进程间通信-匿名管道
前面我们讲了进程间通信的一种方式,共享内存.下面看一看另一种机制,匿名管道.1.什么是管道管道是一个进程的数据流到另一个进程的通道,即一个进程的数据输出作为另一个进程的数据输入,管道起到了桥梁的作用. ...
- linux进程间通信--有名管道
有名管道 只有当一个库函数失败时,errno才会被设置.当函数成功运行时,errno的值不会被修改.这意味着我们不能通过测试errno的值来判断是否有错误存在.反之,只有当被调用的函数提示有错误发生时 ...
- linux进程间通信--无名管道
管道 只能用于具有亲缘关系的进程之间通信是一个半双工的通信模式, 具有固定的写读端和写端,管道可以看成一种特殊的文件,对它可以使用普通的read.write等操作 管道的创建: #include &l ...
随机推荐
- linux下mysql开启远程访问权限及防火墙开放3306端口
默认mysql的用户是没有远程访问的权限的,因此当程序跟数据库不在同一台服务器上时,我们需要开启mysql的远程访问权限. 主流的有两种方法,改表法和授权法. 相对而言,改表法比较容易一点,个人也是比 ...
- docker基础
docker1.映射主机目录到镜像: $ docker run -v /data:/mnt -i -t image-id bash移除:docker rm -v 2.停止所有的container,这样 ...
- 五、Android学习第四天补充——Android的常用控件(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 五.Android学习第四天补充——Android的常用控件 熟悉常用的A ...
- ELF Format 笔记(二)—— ELF Header
ilocker:关注 Android 安全(新入行,0基础) QQ: 2597294287 以 32 位的 ELF header 数据结构为例: #define EI_NIDENT 16 typede ...
- plsql+绿色版oracle连接远程数据库配置及提示缺少msvcr71.dll解决方法
之前一直用的sqldeveloper连接oracle数据库,这个免费而且也是官方出品,除了体积略大启动略慢外,也没什么不好的.. 一次偶然机会决定试一下plsql,整理一下安装资料,需要本地oracl ...
- 【CSS】理解CSS
CSS(Cascading Style Sheet,层叠样式表),及其精巧且富有表达力,开发者可以用最为高效的方式高度掌控网页内容的表示. 1. 盒模型 CSS中的一个基本概念是盒模型(box mod ...
- [cocos2d-x]深入--几个代表性的类 (续)
摘要: 此文对cocos2d-x引擎中最具代表性,最能体现框架结构的几个类做了简单的介绍, 包括Director,Application, Renderer, EventDispatcher, Sch ...
- ubuntu14安装Qt
首先下载Qt源码 https://download.qt.io/archive/qt/4.8/4.8.4/ 这里我下载的是qt-everywhere-opensource-src-4.8.4.tar. ...
- QuickFix/J 源代码
三). 客户化FIX解析 基础知识:以下文章内容描述的前提是已经根据自己的业务规则,生成了符合要求的数据字典,并且使用QuickFix/J自带的 ant 的 jar target生成了客户化的协议解析 ...
- 代码管理工具之git的学习
1.代码管理工具git的学习 http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html 2.github的使用帮助 https:// ...