当前位置: 首页 > java >正文

Linux进程 线程 进程间通信 IPC——管道

进程间通信(IPC机制)的方法:

        (1)管道 (2)信号量 (3)共享内存 (4)消息队列 (5)套接字

有名管道

管道的分类:有名管道和无名管道 这其中有名管道也叫做命名管道

区别:有名管道在任意两个进程之间通信。而无名管道是在父子进程之间通信。

创建有名管道使用命令:mkfifo

打开管道:open();

关闭管道:close();

读数据:read();

写入数据:write();

一般来说,如果进程a要从键盘获取数据传递给另一个进程b,需要使用一个文件。而这个所带来的问题就是,很慢并且读数据时,对于a什么时候会进行写入时未知的。

管道创建之后,他会在内存上分配一块空间。所以,管道的大小永远为0;其中管道一个是读打开,一个是写打开。

//a.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <assert.h>
#include <string.h>int main()
{int fd=open("fifo",O_WRONLY);assert(fd!=-1);printf("fd=%d\n",fd);write(fd,"hello",5); close(fd);
}//b.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <assert.h>int main()
{int fd=open("./fifo",O_RDONLY);assert(fd!=-1);printf("fd=%d\n",fd);   char buff[128]={0};read(fd,buff,127);printf("read:%s\n",buff);close(fd);exit(0);
}

 管道的特点:

(1)管道必须读,写进程同时open,否则会阻塞;

(2)如果管道没有数据,那么read会阻塞;

(3)管道的写端关闭,读read返回值为0

(4)管道打开的时候只有只读和只写两种方式,读写方式打开是未定义的。

无名管道

无名管道:父子进程间通信

创建无名管道的命令:pipe

int pipe (int pipefd[2]);

调用pipe系统调用之后,返回两个文件描述符,fd[0]为读端,fd[1]为写端;

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <assert.h>
#include <string.h>int main()
{int fd[2];assert(pipe(fd)!=-1);//fd[0]  fd[1] pid_t pid=fork();assert(pid!=-1);if(pid==0){close(fd[1]);char buff[128]={0};read(fd[0],buff,127);printf("child read:%s\n",buff);close(fd[0]);}else{close(fd[0]);write(fd[1],"hello",5);close(fd[1]);}exit(0);
}

 管道的特点:

(1)管道必须读,写进程同时open,否则会阻塞;

(2)如果管道没有数据,read会阻塞

(3)管道的写端关闭,读端的返回值为0

(4)管道打开的时候只有只读和只写两种方式,读写方式打开时未定义的

(5)无论有名还是无名,写入管道的数据都在内存中(管道的大小永远为0)

(6)管道是一种半双工通信方式(通信方式有单工,半双工,全双工)

(7)有名管道和无名管道的区别:有名管道可以在任意进程间使用,无名管道主要在父子进程间通信

(8)管道的读端关闭,写会产生异常。


 

http://www.xdnf.cn/news/8402.html

相关文章:

  • 全国青少年信息素养大赛-python编程—省赛真题—卡牌游戏
  • Redis配置文件详解
  • 树 Part 10
  • JFace中MVC的表的单元格编辑功能的实现
  • Datawhale_PyPOTS_task6
  • 【安全攻防与漏洞​】​​HTTPS中的常见攻击与防御​​
  • 机器人强化学习入门学习笔记(三)
  • 洛谷 P1800 software(DP+二分)【提高+/省选−】
  • 三步快速部署一个本地Windows/Linux大语言模型ChatGLM(环境配置+权重下载+运行)
  • AI架构分层原则
  • Stack主题遇到的问题
  • C# WinForm应用程序多语言实现全面指南
  • deepseek组合使用
  • 测试关键点
  • 【Kafka】编写消费者开发模式时遇到‘未解析的引用‘SIGUSR1’’
  • 掌握递归:编程中的优雅艺术
  • 精益数据分析(79/126):从黏性到爆发——病毒性增长的三种形态与核心指标解析
  • Swagger、Springfox、Springdoc-openapi 到底是什么关系
  • 使用 GPUStack 纳管摩尔线程 GPU 进行大语言模型和文生图模型的推理
  • ASPICE认证 vs. 其他标准:汽车软件开发的最优选择
  • C# UDP协议:核心原理、高效实现与实战进阶指南​
  • 2025语音语聊系统源码开发深度解析:WebRTC与AI降噪技术如何重塑语音社交体验
  • 智能存储如何应对极端环境挑战?忆联独家解锁PCIe 5.0固态存储“抗辐射”黑科技,重新定义数据安全防护新高度
  • 机会成本与沉没成本:如何做出理性经济决策
  • grafana/loki-stack 设置日志保存时间及自动清理
  • HarmonyOS NEXT~鸿蒙AI开发全解析:HarmonyOS SDK中的智能能力与应用实践
  • PCB设计教程【入门篇】——电路分析基础-读懂原理图
  • lanqiaoOJ 4330:欧拉函数模板
  • OceanBase 共享存储:云原生数据库的存储
  • 解析 Python 中的 if name == main 机制