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

无名管道C语言

无名管道的特点

无名管道属于单向通讯

无名管道只能用于父子进程通讯

无名管道发送端叫做写端,接收端叫做读端

无名管道将读端与写端抽象成两个文件进行操作,在无名管道创建成功之后,则会将读端与写端的文件描述符存入数组

创建无名管道

pipe()

#include <unistd.h>
int pipe(int pipefd[2]);

功能

管道创建之后,内核会将文件描述符存储到数组

函数参数

pipefd:用于存储无名管道读端与写端的文件描述符的数组
pipefd[0]:读端文件描述符
pipefd[1]:写端文件描述符

函数返回值

成功:0
失败:-1,设置 errno

示例代码

创建一个子进程,负责循环从管道中读取数据,父进程从键盘读取数据后,写入到管道中,输入 “quit” 字符
串时退出

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>int main() {int pipefd[2];pid_t pid;char buf[1024];if (pipe(pipefd) == -1) {perror("pipe");exit(EXIT_FAILURE);}pid = fork();if (pid == -1) {perror("fork");exit(EXIT_FAILURE);}if (pid == 0) {close(pipefd[1]);while (1) {memset(buf,0,strlen(buf));ssize_t n = read(pipefd[0], buf, sizeof(buf));if (n <= 0||(strncmp(buf,"quit",4)==0)) {printf("fork 退出!\n");break;}putchar('\n');printf("子进程接收到: %s\n", buf);}close(pipefd[0]);exit(EXIT_SUCCESS);} else {close(pipefd[0]);while (1) {memset(buf,0,strlen(buf));printf("请输入要发送的数据(输入 'quit' 退出):");fgets(buf, sizeof(buf), stdin);buf[strlen(buf)-1]='\0';write(pipefd[1], buf, strlen(buf));if (strncmp(buf, "quit", 4) == 0) {close(pipefd[1]);break;}}wait(NULL);}return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • React native页面突然白屏
  • Mamba+Transformer完美融合,效果炸裂!
  • UE4 SLUA IOS打包报错解决办法
  • Python零基础入门教程
  • WSL和Windows建立TCP通信协议
  • 蓝桥杯 Python 研究生组-2023-省赛-分糖果-深度算法
  • 专业人士如何选?揭秘4款2024年常用的电脑录屏软件!
  • axure10的安装与使用教程,问题整理
  • 基于SpringBoot+Vue的健身俱乐部网站(带1w+文档)
  • 深入理解C语言中的枚举
  • 2024年让短片制作不再难,4款剪辑软件助你一臂之力!
  • 「码」上行动!一物一码+TPM让“多进货多卖货”不再是口号!
  • C/C++进阶 (8)哈希表(STL)
  • 基于Cloudflare搭建私有Docker镜像源
  • 五种C/C++ 随机数生成方法
  • 【EOS】Cleos基础
  • es的写入过程
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • overflow: hidden IE7无效
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 入门级的git使用指北
  • 用element的upload组件实现多图片上传和压缩
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​configparser --- 配置文件解析器​
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • # Redis 入门到精通(一)数据类型(4)
  • # 移动硬盘误操作制作为启动盘数据恢复问题
  • #DBA杂记1
  • #HarmonyOS:基础语法
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (多级缓存)多级缓存
  • (分类)KNN算法- 参数调优
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (十三)Flask之特殊装饰器详解
  • (转)C#调用WebService 基础
  • (转)Sublime Text3配置Lua运行环境
  • (转载)PyTorch代码规范最佳实践和样式指南
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .Net Web项目创建比较不错的参考文章
  • .Net6使用WebSocket与前端进行通信
  • .NET连接数据库方式
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • @Slf4j idea标红Cannot resolve symbol ‘log‘
  • [ C++ ] template 模板进阶 (特化,分离编译)
  • [Algorithm][综合训练][拜访][买卖股票的最好时机(四)]详细讲解
  • [flume$2]记录一个写自定义Flume拦截器遇到的错误
  • [Gym-102091E] How Many Groups
  • [HDU3710]Battle over Cities
  • [iOS]-网络请求总结
  • [Java][Liferay] File system in liferay
  • [java基础揉碎]文件IO流