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 ...
随机推荐
- easyui datagrid 键盘上下控制选中行
扩展datagrid的一个方法keyCtr $.extend($.fn.datagrid.methods, { keyCtr : function (jq) { return jq.each(fun ...
- coursera机器学习笔记-机器学习概论,梯度下降法
#对coursera上Andrew Ng老师开的机器学习课程的笔记和心得: #注:此笔记是我自己认为本节课里比较重要.难理解或容易忘记的内容并做了些补充,并非是课堂详细笔记和要点: #标记为<补 ...
- [SqlServer]创建链接服务器
把一个数据库中数据表中的内容,从一个SQL SERVER服务器 导出到另一个SQL Server服务器 不同服务器数据库之间的数据操作 --创建链接服务器 exec sp_addlinkedserv ...
- 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据操作(二)
CSSDesk body { background-color: #2574b0; } /*! zybuluo */ article,aside,details,figcaption,figure,f ...
- 烂泥:nagios监控单网卡双IP
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 公司的业务有几台服务器存放在IDC机房中,说是双线路.但是我看到网卡的配置是单网卡双IP的形式.如下: 而公司这边的线路是联通的IP,如下: nagio ...
- JavaScript中产生标识符方式的演变
本文记录下JS中产生标示符方式的演变,从ES5到ES6,ES5及其之前是一种方式,只包含两种声明(var/function),ES6则增加了一些产生标识符的关键字,如 let.const.class. ...
- 利用NuSoap开发WebService(PHP)
利用NuSoap开发WebService(PHP) 分类: php 2010-09-08 12:00 5005人阅读 评论(1) 收藏 举报 webservicephpsoapstringencodi ...
- hdu 4960 Another OCD Patient(dp)
Another OCD Patient Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Ot ...
- java23种设计模式
http://www.cnblogs.com/beijiguangyong/archive/2010/11/15/2302807.html#_Toc281750445 http://www.runoo ...
- Java写的斗地主游戏源码
源码下载在最后 我们的前年的课设要求做一个斗地主程序,当时正在愁如何做界面,当时刚好在学习C#,于是就用C#完成了这个程序.一方面,当时我C#功底还很差(其实现在也不怎么样),很多地方用了“笨办法”, ...