Linux 进程间通信, 管道

news2024/11/24 10:47:45

文章目录

  • 前言
  • 一、常见的进程间通信方式
  • 二、如何实现管道通信
  • 三、示例代码解析
  • 四、管道的读写行为
  • 总结

前言

在多进程编程中,进程间通信(Inter-Process Communication,IPC)是一种重要的技术手段,它使得不同进程可以安全、可靠地进行数据交换和共享资源。


一、常见的进程间通信方式

  1. 管道(Pipe):管道是一种基于字节流的进程间通信机制。它将一个进程的输出连接到另一个进 的输入,实现了它们之间的单向通信。管道分为匿名管道和命名管道两种。(使用最简单)

  2. 命名管道(Named Pipe):命名管道(也称为FIFO)是一种有名的管道,它允许不相关的进程通过指定的命名管道文件进行通信。不同于匿名管道,命名管道可以用于不相关的进程之间的通信。

  3. 共享内存(Shared Memory):共享内存是一种高效的进程间通信方式。它允许多个进程共享同一块内存区域,从而避免了复制大量数据的开销。进程可以通过读写共享内存来进行通信和数据交换。(无血缘关系)

  4. 信号量(Semaphore):信号量是一种用于进程同步和互斥的系统对象。它用于控制对共享资源的访问,多个进程可以根据信号量的值来进行等待、唤醒和临界区的互斥操作。(开销最小)

  5. 套接字(Socket):套接字是一种用于在网络中进行进程间通信的机制。它可以用于在同一台机器上的进程间通信(本地套接字)或不同机器上的进程间通信(网络套接字)。(最稳定)


二、如何实现管道通信

父进程 在写端 向管道写入数据,子进程 在 读端 从管道读出数据。(父进程 也可以连接 读端,子进程也可以连接 写端)
在这里插入图片描述
管道 是一种最基本的 IPC 机制,作用于有血缘关系的进程之间,完成数据传递。

  1. 管道的特性:
  • 本质是一个伪文件。
  • 由 2 个文件描述符引用,一个表示读端,一个表示写端
  • 规定数据从管道的写端流入管道,从 读端流出。
  1. 管道的局限性:
  • 数据不能 该进程自己写,自己读。
  • 管道中数据不可反复读取。一旦读走,管道中不在存在。
  • 采用半双工通信方式,数据只能在单方向上流动。
  • 只能在共有祖先的基础上使用管道。
  1. pipe 函数 创建,打开 管道

使用 pipe() 函数进行进程间通信时,需要进程具有血缘关系,通常是父子进程之间。如无血缘关系的进程或完全独立的线程,无法直接使用 pipe() 函数进行通信。

pipe 参数为一个数组, 里面有两个句柄(读 写,分别对应管道的读端,写端)。规定: fd[0] --> r ; fd[1] --> w

#include <unistd.h>

int pipe(int pipefd[2]);

返回值: 成功返回 0,失败返回 -1。
在这里插入图片描述

三、示例代码解析

STDOUT_FILENO:这是一个预定义的常量,表示标准输出的文件描述符。

void sys_error(const char *str)
{		
	perror(str);					// 将最近一次发生的系统调用错误输出到标准错误流
	exit(1);					// 正常终止程序
}

int main(void)
{
   	int fd[2];
	int ret;
 	pid_t pid;
	char buff[20] = "hello pipe!\n";
	char str[20];

	ret = pipe(fd);							// 创建,打开管道
	if(ret == -1)
	{
		sys_error("pipe error!");
	}
	
	pid = fork();								//创建子进程
	if(pid == 0)							
	{
		close(fd[0]);							//子进程 关闭读端
		write(fd[1], buff,sizeof(buff));			//向管道写入数据
		close(fd[1]);
	}
	else 			
	{
		close(fd[1]);							//父进程 关闭写端
		ret = read(fd[0],str,sizeof(str));				//从管道读出数据
		write(STDOUT_FILENO, str,sizeof(str));			// 将 str 写入标准输出中
		close(fd[0]);
	}
}

在这里插入图片描述

四、管道的读写行为

读管道:

  1. 管道有数据,read 返回实际独到的字节数。
  2. 管道无数据:
  • 无写端, read 返回 0。
  • 有 写端, read 阻塞等待。

写管道:

  1. 管道 无 读端, 异常终止。
  2. 管道 有 读端:
  • 管道 已满,阻塞等待。
  • 管道未满,返回写出的字节个数。

总结

进程间管道通信是一种基本而有效的进程间通信机制,在多进程编程中扮演着重要角色。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/857248.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

函数的声明和定义

1、函数声明 //告诉编译器有一个函数叫什么&#xff0c;参数是什么&#xff0c;返回类型是什么。但是具体是不是存在&#xff0c;函数声明决定不了。 //函数的声明一般出现在函数的使用之前。要满足先声明后使用。 //函数的声明一般要放在头文件中的。 2、函数的定义 //函数…

Linux(进程间通信详解)

进程间通信&#xff0c;顾名思义&#xff0c;就是进程与进程之间互通信交流&#xff0c;OS保证了各进程之间相互独立&#xff0c;但这不意味着进程与进程之间就互相隔离开&#xff0c;在不少的情况下&#xff0c;进程之间需要相互配合共同完成某项6任务&#xff0c;这就要求各进…

8月9日算法刷题【6道题】

8月9日算法刷题 一、排序1. 成绩排序&#xff08;清华大学考研机试题&#xff09;考点&#xff1a;结构体排序在结构体中定义排序使用比较器定义排序 注意问题&#xff1a;需要处理 值相等时 先后顺序 2. 成绩排序2( 清华大学考研机试题 )1. 从尾到头打印链表本题考点栈 2. 在O…

hgdbdevelop弹窗无法使用

瀚高数据库 目录 环境 文档用途 详细信息 环境 系统平台&#xff1a;Microsoft Windows (64-bit) 10 版本&#xff1a;4.5 文档用途 解决双击exe程序出现弹窗&#xff0c;点击Disable Modules and Continue没反应 详细信息 1.打开管理工具exe程序&#xff0c;出现弹窗如下图&…

【运维小能手】交换机二层环路问题如何处理

1 网络业务故障&#xff0c;如何确认存在环路&#xff1f; 网络业务故障后&#xff0c;如发生二层环路&#xff0c;通常会存端口流量数据风暴和反复大量的MAC漂移现象。因此&#xff0c;在骨干链路所在的节点&#xff0c;通过如下三步操作&#xff1a; 图1&#xff1a;环…

向量检索在大模型应用场景的技术和实践

一、向量检索应用简介 向量是多维数学空间里的一个点&#xff0c;在各维度上的坐标的一串数字。这个点就是来源于真实世界的物体进行数字化之后在数学空间的投影。那么不同点之间有一个数学关系&#xff0c;就是距离&#xff0c;距离远近就代表两个物体的相似程度。 非结构化数…

Semantic and Syntactic Enhanced Aspect Sentiment Triplet Extraction

创新点 图-序列双重表示: 通过将句子中的语义和句法关系表示为图&#xff0c;并使用图神经网络&#xff08;GNNs&#xff09;进行编码&#xff0c;同时保留原始句子的顺序信息&#xff0c;S3E2能够更精确地捕捉三元组元素之间的复杂关系。许多传统方法可能只依赖于线性或浅层表…

分支和循环语句(1)(C语言)

目录 什么是语句&#xff1f; 分支语句&#xff08;选择结构&#xff09; if语句 悬空else if书写形式的对比 switch语句 在switch语句中的 break default子句 循环语句 while循环 while语句中的break和continue for循环 语法 break和continue在for循环中 for语句和…

vue3 vite gzip

1、首先前端项目里安装 vite-plugin-compression 插件 yarn add vite-plugin-compression 2、在 vite.config.js 中 import vue from vitejs/plugin-vue import { defineConfig } from vite import compressPlugin from vite-plugin-compressionexport default defineConf…

【TI毫米波雷达笔记】sdk传参时的type避坑

【TI毫米波雷达笔记】sdk传参时的type避坑 这个函数要传一个结构体进去 然后结构体里面有个adcoutcfg结构体变量 adcoutcfg结构体里面共有三个变量 一个adcbitformat结构体 另外两保留 点开adcbitformat结构体发现是个32位段 一共四级结构体 那么请问 为什么adcoutcfg变量不直…

管理类联考——逻辑——论证逻辑——汇总篇——真题和典例——支持

支持 没有特点的 199-2017-1-30——支持论点 离家300米的学校不能上&#xff0c;却被安排到2千米外的学校就读&#xff0c;某市一位适龄儿童在上小学时就遭遇了所在区教育局这样的安排&#xff0c;而这一安排是区教育局根据儿童户籍所在施教区做出的。根据该市教育局规定的“…

科技前沿:一文带你读懂“星闪点亮万物互联”

目录 一、星闪简介 二、星闪技术的模式 三、星闪技术六大优势 四、应用场景 智能汽车 智能工业 智能穿戴 智能家居 智能终端 一、星闪简介 星闪NearLink是由中国信通院牵头发起的星闪联盟&#xff08;NearLink Alliance&#xff09;推出的一种新一代近距离无线连接技…

什么是DNS欺骗及如何进行DNS欺骗

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、什么是 DNS 欺骗&#xff1f;二、开始1.配置2.Ettercap启动3.操作 总结 前言 我已经离开了一段时间&#xff0c;我现在回来了&#xff0c;我终于在做一个教…

Spring Boot集成Mybatis Plus通过Pagehelper实现分页查询

文章目录 0 简要说明Pagehelper1 搭建环境1.1 项目目录1.2 项目搭建需要的依赖1.3 配置分页插件拦截器1.4 源代码启动类实体类数据层xml映射文件业务层业务层实现类控制层接口配置swagger请求体 2 可能出现的疑问或者问题2.1 关于total属性疑问2.2 分页不生效问题 3 案例说明3.…

【高危】 Zoom Desktop Client for Windows <5.14.5 权限升级漏洞

漏洞描述 Zoom 是一种用于视频会议、在线会议和远程协作的软件平台。 Zoom Desktop Client for Windows 5.14.5 之前版本由于对数据的真实性验证不足&#xff0c;经过身份验证的攻击者可通过网络访将权限升级为 SYSTEM 用户。 漏洞名称Zoom Desktop Client for Windows <…

IDEA如何调试Stream API

Stream API现在在实际开发中应用非常广泛&#xff0c;经常会遇到需要调试Stream API的场景&#xff0c;这篇文章主要讲解如何使用IDEA调试Stream Testpublic void test(){Stream.of(10, 20, 30, 40, 50).mapToInt(e->e*10).filter(e->e>200).forEach(System.out::pri…

docker基本使用方法

docker使用 1. Docker 介绍 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。Docker 使您能够将应用程序与基础架构分开&#xff0c;从而可以快速交付软件。通过利用 …

Blockchain投资:是否是实现财务自由的捷径?

随着Blockchain技术的不断发展和应用&#xff0c;越来越多的人开始探索Blockchain投资的机会。Blockchain作为一种分布式记账技术&#xff0c;以其去中心化、透明性和安全性等特点&#xff0c;吸引了众多投资者的关注。但是&#xff0c;Blockchain投资是否真的可以成为实现财务…

unity 修改默认脚本

using System.Collections; using System.Collections.Generic; using UnityEngine; //***************************************** //创建人&#xff1a; xxxx //功能说明&#xff1a; //***************************************** #ROOTNAMESPACEBEGIN# public class #SCRI…

0基础学习VR全景平台篇 第82篇:智慧眼-角色是什么?如何运用呢?

一、功能说明 角色是指城市运营工作开展时所需要设定的成员职称或者人物定位&#xff0c;如管理员、督察员、镇街主管、镇接干事、网格员等等。 后台编辑界面 点击【新增】&#xff0c;填写角色的名称&#xff0c;若有上级&#xff0c;还需选择对应的父级角色。如管理员为最…