linux ipc——pipe
1、概念
管道:pipe,又称无名管道,是一种特殊类型的文件,在应用层体现为两个打开的文件描述符。
它和有名管道、信号都是unix进程间通信方式。
2、用途
主要用于父进程与子进程之间,或者两个兄弟进程之间。
3、特点
7个,
①半双工。
数据在同一时候只能在同一个方向流动(举例:对讲机。全双工:手机,单工:遥控器)
②只存在于内存当中。
不是个普通的文件,不属于于文件系统(与普通文件的区别:无法通过open、close、read、write来操作管道文件,只能通过继承来获取文件描述符)
③没有名字。
只能在具有公共祖先的进程之间使用
④缓冲区大小固定。
linux中,管道的缓冲区大小事4kb。
⑤传输的数据时无格式的。
故要求读写双方约定数据格式、大小
⑥数据只能从管道一端读,一端写。
⑦读数据为一次性操作,一旦读走,数据被抛弃,释放空间。
4、使用方法
#include <unistd.h>
int pipe(int fd[2]);
功能:经由参数fd返回两个文件描述符
参数:
fd为int型数组的首地址,其存放了管道的文件描述符fd[0]、fd[1]。
fd[0]为读而打开,fd[1]为写而打开管道
返回值:
成功:返回 0
失败:返回-1
5、举例
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(int argc, char *argv[])
{
int fd_pipe[2];
char buf[] = "hello world";
pid_t pid;
if (pipe(fd_pipe) < 0)
perror("pipe");
pid = fork();
if (pid < 0)
{
perror("fork");
exit(-1);
}
if (pid == 0)
{
write(fd_pipe[1], buf, strlen(buf));
_exit(0);
}
else
{
wait(NULL);
memset(buf, 0, sizeof(buf));
read(fd_pipe[0], buf, sizeof(buf));
printf("buf=[%s]\n", buf);
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?