[国嵌攻略][080][无名管道通讯]
通讯目的
1.数据传输
一个进程需要将数据发送给另外一个进程。
2.资源共享
多个进程之间共享同样的资源。
3.通知事件
一个进程需要向另外一个/组进程发送消息,通知它们发生了某事件。
4.进程控制
有些进程希望完全控制另外一个进程的执行,此时控制进程希望能够拦截另外一个进程的所有操作,并能够及时知道它的状态改变。
通信方式
1.无名管道(pipe):数据传输
2.有名管道(fifo):数据传输
3.信号(signal):通知事件
4.消息队列
5.内存共享
6.信号量:资源共享
7.套接字(socket)
管道通信
一个进程在管道的尾部写入数据,另一个进程从管道的头部读出数据。管道包括无名管道和有名管道两种,前者只能用于父进程和子进程之间的通信,后者可与用于运行与同一系统中的任意两个进程间的通信。
管道通信的特点
1.管道通信是单向的,有固定的读端和写端。
2.数据被进程从管道读出后,在管道中该数据就不存在了。
3.当进程去读取空管道的时候,进程会阻塞。
4.当进程往满管道写入数据时,进程会阻塞。
5.管道容量为64KB。
无名管道
在Linux系统中,无名管道一旦创建完成后,操作无名管道等同于操作文件。无名管道的读端被视作一个文件,无名管道的写端也被视作一个文件。因此可以使用read,write,close等函数来访问无名管道。
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> void main(){ //创建管道 int pipefd[2]; pipe(pipefd); //创建进程 int pid; pid = fork(); //管道通讯 if(pid > 0){ //写入数据 char wbuf[13] = "hello world!"; write(pipefd[1], wbuf, 13); //等待读取 wait(NULL); //关闭写管道 close(pipefd[1]); }else if(pid == 0){ //读取数据 char rbuf[13]; read(pipefd[0], rbuf, 13); //显示数据 printf("%s\n", rbuf); //关闭读管道 close(pipefd[0]); } //结束进程 exit(0); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术