Linux —— 进程间通信(管道)
目录
一,进程间通信
二,管道
匿名管道
命名管道
一,进程间通信
进程间通信(IPC,InterProcess Communication),即在不同进程之间进行信息的传播或交换;由于一般进程用户地址空间是独立的,不可直接访问其他进程地址空间,因此进程间进行信息交换必须通过系统内核进行;
进程间通信目的
- 数据传输,将一个进程的数据发送给另一个进程;
- 资源共享,多个进程间共享同样的资源;
- 通知事件,一个进程向另一个进程或一组进程发送信息,通知它们发生了某种事件(如进程终止时通知父进程);
- 进程控制,有些进程希望完全控制另一个进程的执行(如debug),此时进程希望能够拦截另一个进程的所有异常,并能够及时知道其状态的改变;
进程间通信的分类
- 管道
- 匿名管道pipe
- 命名管道
- System V IPC
- system V 消息队列
- system V 共享内存
- system V 信号量
- POSIX IPC
- 信息队列
- 共享内存
- 信息量
- 互斥量
- 调节变量
- 读写锁
二,管道
匿名管道pipe、命名管道;
匿名管道
Linux通过使用竖线(管道符 | )来连接多个命令,以形成一个管道;管道符前面命令的输出作为管道符后面命令的输入,管道中的数据只能单向流动(即半双工通信),要实现双向流动需创建两个管道;另外,此管道为匿名管道,用完即被自动销毁,且只能在父子进程间通信;
[wz@192 Desktop]$ cat test.c | grep main
int main()
父进程需读写都打开文件,这样子进程继承时才会有读写,然后通过关闭父子进程对应的读写,来实现信息的传输;不关闭相应的读写,也可通信,但一般关闭防止误操作;
管道函数 pipe
- 创建匿名管道
- 创建成功,返回0;
- 创建失败,返回-1;
pipefd为文件描述符数组
- pipefd[0],指定管道读端,默认值为3;
- pipefd[1],指定管道写端,默认值为4;
#include <stdio.h>
#include <unistd.h> int main()
{ int pipefd[2]; if(pipe(pipefd) < 0) { perror("pipe"); return 1; } printf("pipefd[0]: %d\n", pipefd[0]); printf("pipefd[1]: %d\n", pipefd[1]); return 0;
}
[wz@192 pipe]$ ./test
pipefd[0]: 3
pipefd[1]: 4
int main()
{ int pipefd[2]; if(pipe(pipefd) < 0){ perror("pipe"); return 1; } char buf[32]; write(pipefd[1],"hellopipe",32); //向管道内写read(pipefd[0],buf,32); //从管道内读 printf("buf: %s\n", buf); return 0;
}
[wz@192 pipe]$ ./test
buf: hellopipe
//子进程写入,父进程读取
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>int main()
{int pipefd[2];if(pipe(pipefd) < 0){perror("pipe");return 1;}pid_t id = fork();if(id < 0){perror("fork");return 1;}else if(id == 0){close(pipefd[0]);char* msg = "child msg";int count=5;while(count){printf("child write: %s\n",msg);write(pipefd[1],msg,strlen(msg));sleep(1);count--;}close(pipefd[1]);exit(0);}else{char buf[64];close(pipefd[1]);while(1){ssize_t sz=read(pipefd[0],buf,sizeof(buf)-1);if(sz>0){buf[sz]=0;printf("father read: %s\n",buf);}else if(sz==0){printf("pipe file empty!\n");break;}}close(pipefd[0]);printf("close read\n");int status = 0; pid_t wait_pid = waitpid(id,&status,0); if(WIFEXITED(status) && wait_pid==id) printf("child exit normal, exit code: %d\n", WEXITSTATUS(status)); else printf("child exit error, exit sig: %d\n", WTERMSIG(status)); }return 0;
}
- 如管道为空,则读端需等待数据就绪,即read阻塞;
- 如管道在写端已写满,需等待管道有空闲空间才可继续写入,即write阻塞;
- 管道自带同步机制;
- 管道是单向通信的;
- 管道是面向字节流的;
- 管道只能保证具有血缘关系的进程通信;
- 管道可保证一定程度数据读取的原子性;
//子进程持续在写入,父进程关闭读
//此时OS会直接关闭子进程else{char buf[64];close(pipefd[1]);while(1){ssize_t sz=read(pipefd[0],buf,sizeof(buf)-1);if(sz>0){buf[sz]=0;printf("father read: %s\n",buf);close(pipefd[0]);break;}else if(sz==0){printf("pipe file empty!\n");break;}}printf("close read\n");int status = 0; pid_t wait_pid = waitpid(id,&status,0); if(WIFEXITED(status) && wait_pid==id) printf("child exit normal, exit code: %d\n", WEXITSTATUS(status)); else printf("child exit error, exit sig: %d\n", WTERMSIG(status)); }
//子进程退出信号为13,即SIGPIPE
[wz@192 pipe]$ ./test
child write: child msg
father read: child msg
close read
child write: child msg
child exit error, exit sig: 13
[wz@192 pipe]$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 7154
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 4096
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
命名管道
命名管道是一种特殊类型的文件,可在不相关进程间交换数据,使用FIFO文件实现;
使用命令mkfifo,创建命名管道
[wz@192 pipe]$ mkfifo pipefile
[wz@192 pipe]$ ll pipefile
prw-rw-r--. 1 wz wz 0 8月 18 08:24 pipefile
使用函数mkfifo,创建命名管道
匿名管道与命名管道区别
- 匿名管道由函数pipe创建并打开;
- 命名管道由函数或命令mkfifo创建,再由open打开;
- 唯一区别即创建和打开方式不同;
[wz@192 pipe]$ echo abc > pipefile
[wz@192 pipe]$ while :; do echo "1,##########"; cat pipefile; echo "2,#########"; sleep 1; done
1,##########
abc
2,#########
1,##########
实现server&client通信
//makefile
.PHONY:all
all: server clientserver:server.cgcc -o $@ $^
client:client.cgcc -o $@ $^ .PHONY:clean
clean:rm -rf server client
//server.c
//创建命名管道,并读
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> int main()
{ int ret = mkfifo("pipefile", 0644); if(ret == -1){ perror("mkfifo"); return 1; } int pipefd = open("pipefile", O_RDONLY); if(pipefd < 0){ perror("open"); return 2; } char msg[64]={0}; while(1){ printf("please wait ...\n"); ssize_t sz = read(pipefd, msg, sizeof(msg)-1); if(sz > 0){ msg[sz]=0; printf("server read: %s\n", msg); } else if(sz == 0){ printf("client quit!\n"); break; } else{ perror("read"); return 3; } } close(pipefd); return 0;
}
//client.c
//向管道写入
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> int main()
{ int pipefd = open("pipefile", O_WRONLY); if(pipefd < 0){ perror("open"); return 1; } char msg[64]={0}; while(1){ printf("please write ...\n"); ssize_t sz = read(0, msg, sizeof(msg)-1); if(sz > 0){ msg[sz]=0; write(pipefd, msg, strlen(msg)); } else if(sz == 0){ printf("client read empty!\n"); break; } else{ perror("client read\n"); return 2; } } close(pipefd); return 0;
}
相关文章:

Linux —— 进程间通信(管道)
目录 一,进程间通信 二,管道 匿名管道 命名管道 一,进程间通信 进程间通信(IPC,InterProcess Communication),即在不同进程之间进行信息的传播或交换;由于一般进程用户地址空间是…...
python常用
环境配置 conda Conda自动补全 在终端激活conda环境的时候按tab不能自动补全activate和环境名。安装后可用tab进行补全。 安装 conda-bash-completion 插件:GitHub 安装方法: conda install -c conda-forge conda-bash-completion常用命令 #创建虚拟…...

jeecg如何创建报表并配置到菜单中
当使用jeecg创建单表之后,需要进行报表显示,并把报表配置到菜单中,该如何操作呢?下面进行详细讲解。这里以课程表这张表为例进行讲解。 一.表单创建完成,并配置好菜单栏。具体步骤略,如下图: 二.创建积木报表 1.左侧边栏展开低代码开发菜单,进入报表设计器栏目 2.进…...
Servlet+JDBC实战开发书店项目讲解第12讲:会员管理功能
ServletJDBC实战开发书店项目讲解第12讲:会员管理功能 实现思路: 显示会员列表: 创建一个管理页面,用于显示所有会员的信息。在后端,创建一个Servlet来处理显示会员列表的请求。在该Servlet中,通过JDBC从数…...

java面向对象——继承以及super关键字
继承的概念 1. 被继承的类称为父类(超类),继承父类的类都称为子类(派生类) 2. 继承是指一个对象直接使用另一个对象的属性和方法,但是能继承非私有的属性和方法;(1) 构造方法不能被继承。(2) 但…...
[机缘参悟-101] :IT人 - 遵从世界本源的样子,不带个人情感、道德、认知倾向,接纳一切,你就拥有无限的力量
目录 道的本义 如来的本义 观音的本义 无为而治本质是顺势而为 儒家的本质 感悟: 道的本义本质:天地的力量和运行规律 "天地以万物为刍狗"是出自《道德经》第五十章的一句话。在这句话中,"天地"指的是宇宙&#x…...
C++--深度理解智能指针
PS:智能指针简单应用看这里 http://t.csdn.cn/qN7IK 1.智能指针的介绍 在C中,智能指针有三个版本,分别为: auto_ptr unique_ptr shared_ptr 这三个版本的智能指针中,shared_ptr最为完善,auto_ptr基本上没有太大用…...
Spring Boot使用MySQL的默认连接池
笔者在近期秋招面试的时候被问到了这个问题,现在简单梳理一下便于后期重新回顾,并加深记忆。 Spring Boot 默认使用的数据库连接池是 HikariCP(开源库地址)。 HikariCP 是目前性能最好的连接池之一,它具有高度的性能、可靠性和可扩展性&…...
conda使用教程
Conda介绍 conda可以理解为一个工具,也是一个可执行命令,其核心功能是包管理和环境管理。包管理与pip的使用方法类似似,环境管理则是允许用户方便滴安装不同版本的python环境并在不同环境之间快速地切换。 conda的设计理念 conda将几乎所有…...
什么是LLM大语言模型?
什么是LLM大语言模型? 大语言模型(英文:Large Language Model,缩写LLM),也称大型语言模型,是一种人工智能模型,旨在理解和生成人类语言。它们在大量的文本数据上进行训练࿰…...

jenkins同一jar包部署到多台服务器
文章目录 安装插件配置ssh服务构建完成后执行 没有部署过可以跟这个下面的步骤先部署一遍,我这篇主要讲jenkins同一jar包部署到多台服务器 【Jenkins】部署Springboot项目https://blog.csdn.net/qq_39017153/article/details/131901613 安装插件 Publish Over SSH 这…...

(四)Doceke安装MySQL镜像+Docker启动MySQL容器
Doceke安装MySQL镜像/Docker启动MySQL容器 一、doceke安装MySQL镜像 切换到root用户,su root 。 1、启动Docker 启动:sudo systemctl start docker 停止:systemctl stop docker 重启:systemctl restart docker 查看docker运行…...
Android Studio:Could not initialize class org.codehaus.groovy.vmplugin.v7.Java7
原项目使用jdk8,升级gradle后出现的该问题。 java.lang.NoClassDefFoundError: Could not initialize class org.codehaus.groovy.vmplugin.v7.Java7at org.codehaus.groovy.vmplugin.VMPluginFactory.<clinit>(VMPluginFactory.java:43)at org.codehaus.gro…...

Spring Clould 搜索技术 - elasticsearch
视频地址:微服务(SpringCloudRabbitMQDockerRedis搜索分布式) 初识ES-什么是elasticsearch(P77,P78) 1.elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能…...
android核绑定cpuset配置与检测进程所在核cpuset方法
一、开机阶段 开机有如下阶段。抛开开机动画需要的audio、surfaceflinger等进程,大部分android程序是在/data分区加载完整以后开始加载。所以cpuset的配置可以在 post-fs-data之后。注意,init.rc的不同阶段脚本都可能覆盖前面配置的cpuset。配置好检查与…...

Lnton羚通关于如何使用nanoPC-T4 安装OpenCV?
nanoPC-T4 安装 OpenCV Note: OpenCV has been pre-installed in FriendlyCore/FriendlyDesktop (Version after 201905) and does not require manual installation. Please download the latest FriendlyCore/FriendlyDesktop Image file from the following URL: http://do…...
内存泄漏:前端开发者的噩梦——内存泄露的原因及排查
在前端开发中,内存泄漏是一个常见但令人头疼的问题。它会导致应用程序变得缓慢,不稳定,最终可能崩溃。本文将介绍内存泄漏的概念、常见泄漏原因以及如何排查和预防内存泄漏。 什么是内存泄漏? 内存泄漏是指应用程序中的内存被错…...

高效使用ChatGPT之ChatGPT客户端
ChatGPT客户端,支持Mac, Windows, and Linux 下载地址见文章结尾 软件截图 Windows: Mac: 说明 chatgpt桌面版,相比于网页版的chatgpt,最大的特色是支持历史聊天对话记录导出,且支持三种格式:PNG、PDF、…...

【腾讯云 TDSQL-C Serverless 产品体验】基于TDSQL-C 存储爬取的QQ音乐歌单数据
【腾讯云 TDSQL-C Serverless 产品体验】基于TDSQL-C 存储爬取的QQ音乐歌单数据 文章目录 【腾讯云 TDSQL-C Serverless 产品体验】基于TDSQL-C 存储爬取的QQ音乐歌单数据前言出现的背景一、TDSQL-C数据库是什么?二、TDSQL-C 的特点三、TDSQL-C的应用场景四、基于TD…...
leetcode 6450. k-avoiding 数组的最小总和
给你两个整数 n 和 k 。 对于一个由 不同 正整数组成的数组,如果其中不存在任何求和等于 k 的不同元素对,则称其为 k-avoiding 数组。 返回长度为 n 的 k-avoiding 数组的可能的最小总和。 示例 1: 输入:n 5, k 4 输出&#…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...

Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...