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 ...
随机推荐
- MYSQL管理之主从同步管理
原文地址:MYSQL管理之主从同步管理 作者:飞鸿无痕 MYSQL管理之主从同步管理 MYSQL主从同步架构是目前使用最多的数据库架构之一,尤其是负载比较大的网站,因此对于主从同步的管理也就显得非常重 ...
- expr
将变量的值当作数值处理而不是字符串,shell支持6种算术运算符:加+, 减-,乘\*,除/, 取余%, 括号\( \),每种算术运算符的两边都要有空格 $echo "Res = $(exp ...
- POSIX, Bash, GPL etc
POSIX , SUS, XSI Portable Operating System Interface POSIX是给Unix/Linux系统使用的通用调用接口(SCI, System Call I ...
- RedHat Linux 9.0的安装+入门指南(图文并茂)
一,准备工作1,购买或下载Redhat9的安装光盘(3张盘)或镜像文件2,在硬盘中至少留2个分区给安装系统用,挂载点所用分区推荐4G以上,交换分区不用太大在250M左右比较适合,文件系统格式不论,反正 ...
- Android 的 Handler 总结
<一> Handler的定义: 主要接受子线程发送的数据, 并用此数据配合主线程更新UI. 解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管 ...
- git pull
今天在服务器上git pull是出现以下错误: error: Your local changes to the following files would be overwritten by mer ...
- 留念 C语言第一课简单的计算器制作
留念 C语言第一课简单的计算器制作 学C语言这么久了. /* 留念 C语言第一课简单的计算器制作 */ #include<stdio.h> #include<stdlib.h ...
- iframe 的使用和登陆退出的实现——整个页面跳转
iframe中如果只是页面跳转的话,我们依然只是部分的加载的了,为了实现整个页面的所有内容跳转,下面提供了整个页面跳转的方法. iframe例子 1.总的iframe页面(访问就访问这个) all. ...
- openjudge1768 最大子矩阵[二维前缀和or递推|DP]
总时间限制: 1000ms 内存限制: 65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵. 比如,如下4 * 4的 ...
- FMS 客户端带宽计算、带宽限制
FMS 客户端带宽计算.带宽限制 1. 带宽计算 FMS内置了带宽检测的特性(被称作"native bandwidth detection"),要进行带宽检测,客户端只要在成功连接 ...