网站首页 > 技术教程 正文
概念
管道,是一种把两个进程之间的标准输入和输出连接的起来的一种通信机制,它是单向数据流,一个进程写入管道的所有数据都由内核定向到另一个进程中,另一个进程就可以从管道中读取数据。
管道可以分为匿名管道和命名管道。通常所说的管道是匿名管道,除非指明命名管道。
在Linux系统中,管道比较常用,如 ls -l | grep string 就使用了管道技术。
特点
- 半双工通信的(即数据只能在一个方向上流动),具有固定的读端(fd[0]为读端)和写端(fd[1]为写端)。
- 它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。
- 它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。
函数原型
1) 头文件: #include<unistd.h>
2) 定义函数: int pipe(int filedes[2]);
3) 函数说明: pipe()会创建管道,并将文件描写叙述词由參数filedes数组返回。
filedes[0]为管道的读取端
filedes[1为管道的写入端。
4) 返回值: 若成功则返回零,否则返回-1,错误原因存于errno中。
原理
匿名管道,用于具有亲缘关系的进程间通信,即父子进程间通信。
1、首先,在主进程(父进程)中创建匿名管道,
2、然后,在主进程调用fork创建子进程,这时父子进程同时拥有了管道返回的文件描述符。
3、在父进程(fork 返回值大于0)中,关闭读端(fd[0]),写数据到写端(fd[1]),或者关闭写端 (fd[1]),从读端(fd[0])阻塞读取数据
4、在子进程(fork返回值==0)中,关闭写端(fd[1]),从读端(fd[0])阻塞读取数据,或者关闭读端 (fd[0]),写数据到写端(fd[1])。
代码示例
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int main( int agrc, char **argv )
{
int fds[2]; /* fds[0]read */
pid_t pid;
int ret = pipe( fds );
if ( ret < 0 )
{
printf( "create pipe error\n" );
exit( -1 );
}
ret = fork();
if ( ret < 0 )
{
printf( "fork error!\n" );
exit( -1 );
}
else if ( ret > 0 ) /* 父进程 */
{
/* 关闭读端 */
close( fds[0] );
/* 写数据 */
char data[] = "hello world\n";
write( fds[1], data, strlen( data ) + 1 );
}else { /* 子进程 */
/* 关闭写 */
close( fds[1] );
char buff[20] = { 0 };
/* 读数据 */
read( fds[0], buff, 20 );
printf( "child fork read:%s", buff );
}
return(0);
}
总结
1、匿名管道适用于具有亲缘关系的进程间通信。
2、匿名管道是数据是流向是单向的,进程在写数据时要关闭读端(fd[0]),在读数据是要关闭写端(fd[1])
3、fork 函数返回值大于0,处理父进程逻辑;等于0 ,处理子进程逻辑;小于0创建进程错误。
- 上一篇: shell里面的一些特殊符号
- 下一篇: Python也有“管道”操作,你知道吗?
猜你喜欢
- 2025-05-28 通过代码执行或命令执行写Shell
- 2025-05-28 安卓系统再曝ROM级木马“万蓝” 360手机卫士首家查杀
- 2025-05-28 常用液压元件符号
- 2025-05-28 Linux 的这几种搜索方式,你都会了吗?
- 2025-05-28 R语言——带有误差线和显著性标记的柱状图如何做?
- 2025-05-28 管道图纸上常用符号知多少?管网图常用符号大全!值得收藏备用!
- 2025-05-28 收藏 | 记住这些符号,你也能看懂消防工程图!
- 2025-05-28 「干货」Linux 中的零拷贝技术你居然还不知道?
- 2025-05-28 IT运维与网络工程师必会的30个网络抓包/调试工具
- 2025-05-28 linux 系统中正则表达式的使用
你 发表评论:
欢迎- 最近发表
-
- Win11学院:如何在Windows 11上使用WSL安装Ubuntu
- linux移植(Linux移植freemodbus)
- 独家解读:Win10预览版9879为何无法识别硬盘
- 基于Linux系统的本地Yum源搭建与配置(ISO方式、RPM方式)
- Docker镜像瘦身(docker 减小镜像大小)
- 在linux上安装ollama(linux安装locale)
- 渗透测试系统Kali推出Docker镜像(kali linux渗透测试技术详解pdf)
- Linux环境中部署Harbor私有镜像仓库
- linux之间传文件命令之Rsync傻瓜式教程
- 解决ollama在linux中安装或升级时,通过国内镜像缩短安装时长
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)
本文暂时没有评论,来添加一个吧(●'◡'●)