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

多进程间通信学习之无名管道

  • 无名管道:
  • 首先它是内核空间的实现机制;
  • 然后只能用于亲缘进程间通信
  • 它在内核所占的大小是64KB
  • 它采用半双工的通信方式;
  • 请勿使用lseek函数
  • 读写特点:
  • 若读端存在写管道,那么有多少数据,就写多少数据,直到无名管道写满为止,此时会出现写阻塞,当无名管道出现新的4KB空间,写操作就会解除阻塞;
  • 若读端不存在写管道,会出现管道破裂的情况;
  • 若写端存在读管道,那么有多少数据,就读多少数据,没有数据的时候,会出现阻塞等待
  • 若写端不存在读管道,有多少数据,就读多少,没有数据的时候,就会立即返回,即非阻塞的状态;
  • 创建无名管道(pipe函数):
	#include <unistd.h>int pipe(int pipefd[2]);/*功能:创建一个管道,是一个单向的数据通道,可用于进程间通信数组pipefd返回两个指向管道的文件描述符:pipefd[0]指向管道的读端 pipefd[1]指向管道的写端写入管道的数据被内核缓冲(64KB),直到从管道中读走参数:操作管道的文件描述符数组 pipefd[0]指向读端 pipefd[1] 指向管道的写端返回值:成功 0失败 -1 重置错误码*/ 
  • 实例要求:
  • 创建一个进程,要求使用无名管道,实现父进程写子进程读的操作;
  • 示例代码:
	#include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/wait.h>#include <stdbool.h>int main(int argc, char const *argv[]){   int pipe_fd[2] = {0};if(-1 == pipe(pipe_fd)){perror("pipe error");exit(-1);}pid_t pid = 0;if(-1 == (pid = fork())){perror("fork error");exit(-1);}else if(0 < pid) //父进程写{close(pipe_fd[0]);char buf[128] = {0};while(true){fgets(buf,sizeof(buf),stdin);buf[strlen(buf) - 1] = '\0';write(pipe_fd[1],buf,sizeof(buf));if(!strncmp(buf,"quit",4)){exit(-1);}}sleep(2);wait(NULL);   //回收子进程的资源}else if(0 == pid) //子进程读{close(pipe_fd[1]);char buf[128] = {0};while(true){memset(buf,0,sizeof(buf));read(pipe_fd[0],buf,sizeof(buf));if(!strncmp(buf,"quit",4)){close(pipe_fd[0]);exit(-1);}printf("父进程发来的消息[%s]\n",buf);}}return 0;}
  • 运行结果:
	linux@ubuntu:~$ gcc pipe.c linux@ubuntu:~$ ./a.out hello beijing父进程发来的消息[hello beijing]i love china父进程发来的消息[i love china]quitlinux@ubuntu:~$ 
  • 总结:
  • 为了防止误操作,在父进程和子进程里,分别关闭读端和写端;
http://www.lryc.cn/news/212608.html

相关文章:

  • flink常用的几种调优手段的优缺点
  • 如何选择安全又可靠的文件数据同步软件?
  • 使用反射调用类的私有内部类的私有方法
  • 记一次 AWD 比赛中曲折的 Linux 提权
  • [SpringCloud] Feign 与 Gateway 简介
  • [Unity] 个人编码规范与命名准则参考
  • 堆栈与队列算法-以链表来实现队列
  • 快速入门:使用 Spring Boot 构建 Web 应用程序
  • 01.CentOS7静默安装oracle11g
  • SASE安全访问服务边缘
  • k8s集群升级
  • redis原理 主从同步和哨兵集群
  • 四季古诗赏析
  • 【网络协议】聊聊套接字socket
  • GEO生信数据挖掘(十一)STRING数据库PPI蛋白互作网络 Cytoscape个性化绘图【SCI 指日可待】
  • api接口更新钉钉文档
  • Android---如何同view进行渲染
  • 【LeetCode:26. 删除有序数组中的重复项 | 双指针】
  • 如何判断一个对象是不是一个空对象?
  • C/C++ “variable set but not used“的 警告问题解决方案
  • JAVA安全入门之反射
  • 【c++|opencv】一、基础操作---2.图像信息获取
  • HarmonyOS开发:探索组件化模式开发
  • 目标URL启用了不安全的HTTP方法
  • 大数据之LibrA数据库系统告警处理(ALM-12001 审计日志转储失败)
  • 大模型该被知道的技术实现-面向垂直领域
  • 赛灵思产品系列
  • [Linux C] signal 的使用
  • AI时代产品经理升级之道:ChatGPT让产品经理插上翅膀
  • 计算机网络重点概念整理-第七章 网络安全【期末复习|考研复习】