Linux进程间通信(IPC)

要想进程间通信,数据交换,必须通过内核;

一个进程将数据写到内核,然后另一个进程从内核读走数据。

IPC:进程间通信(interprocess communication)

通信方式:

  • 管道
  • 信号
  • 共享映射区(无血缘关系)
  • 本地套接字

 管道:

概念:

管道是一种最基本的IPC机制,也称匿名管道,应用于有血缘关系的进程之间,完成数据传递。

特质:

  • 管道的本质是一块内核缓冲区
  • 两个文件描述符引用,一个表示读端,一个表示写段
  • 规定数据从管道的写端流入管道,从读端流出
  • 当两个进程都终结的时候,管道也自动消失
  • 管道的读端和写端默认都是阻塞的(写端写满写不进阻塞,读端读不到数据阻塞)

原理: 

  • 管道的实质是内核缓冲区,内部使用环形队列实现
  • 默认缓冲区大小是4K,可以使用ulimit -a命令获取大小
  • 实际操作时缓冲区会根据数据压力做适当调整 

局限性:

  • 数据一旦被读走,便不在管道中存在,不可反复读取
  • 数据只能在一个方向上流动,若要实现双向流动,必须使用两个管道
  • 只能在有血缘关系的进程间使用管道 

 创建管道-pipe函数:

  • 作用:创建一个管道
  • 函数原型: int pipe(int pipefd[2]);也可以写int pipe(int *pipefd)写成pipefd[2]是为了说明传两个fd。
  • 参数:若调用成功,f[0]放读端,f[1]放写端
  • 返回值:成功返回0 ;失败返回-1,并设置error值

步骤:

  1. 父进程调用pipe函数创建管道,得到两个文件描述符fd[0]和fd[1]
  2. 父进程调用fork函数创建子进程,那么子进程也有两个文件描述符指向同一个管道
  3. 父进程关闭管道读端,子进程关闭通道写端。父进程写,子进程读 

结果:

父子进程完成管道命令: 

如:ps -aux | grep bash

文件描述符表:

 标准输出是写到终端,标准输入是从终端读

思路:我们可以使用:dup2(fd[1],STDOUT_FILENO)函数,写到管道的写端

                                    dup2(fd[0],STDIN_FILENO)函数,从管道的读端读

结果:
 

 兄弟进程完成管道命令:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<unistd.h>
#include <sys/wait.h>
int main()
{
	int i=0;
	int fd[2];
	int ret=pipe(fd);
	if(ret<0)
	{
		perror("pipe error");
		return -1;
	}
	for(;i<2;i++)
	{
		pid_t pid=fork();
		if(pid<0)
		{
			perror("fork error");
			return -1;
		}
		else if(pid>0)
		{
			printf("father:pid=[%d]\n",getpid());
			sleep(1);
		}
		else if(pid==0)
		{
			printf("child:pid=[%d],fpid=[%d]\n",getpid(),getppid());
			break;
		}
	}
	if(i==2)
	{
		close(fd[0]);
		close(fd[1]);
		int wstatus;
		while(1)
		{
			pid_t wpid=waitpid(-1,&wstatus,WNOHANG);
			if(wpid==0)
			{
				continue;
			}
			else if(wpid>0)
			{
				if( WIFEXITED(wstatus))
				{
					printf("child[%d],return=[%d]\n",wpid,WEXITSTATUS(wstatus));
				}
			}
			else if(wpid==-1)
			{
				printf("no child is living\n");
				break;
			}
		}
	}
	else if(i==0)
	{
		close(fd[0]);
		dup2(fd[1],STDOUT_FILENO);
		//	close(fd[1]);
		execlp("ps","ps","-aux",NULL);
		perror("execlp error");
		exit(1);
	}
	else if(i==1)
	{
		close(fd[1]);
		dup2(fd[0],STDIN_FILENO);
		//	close(fd[0]);
		execlp("grep","grep","bash",NULL);
		perror("execlp error");
		exit(1);
	}
}

注意点:要关闭父进程的管道读写端口,不然会一直阻塞。

结果:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【知识整理】技术新人的培养计划

一、培养计划落地实操 1. 概要 新人入职&#xff0c;要给予适当的指导&#xff0c;目标&#xff1a; 1、熟悉当前环境&#xff1a; 生活环境&#xff1a;吃饭、交通、住宿、娱乐 工作环境&#xff1a;使用的工具&#xff0c;Mac、maven、git、idea 等 2、熟悉并掌握工作技…

【机器学习】单变量线性回归

文章目录 线性回归模型&#xff08;linear regression model&#xff09;损失/代价函数&#xff08;cost function&#xff09;——均方误差&#xff08;mean squared error&#xff09;梯度下降算法&#xff08;gradient descent algorithm&#xff09;参数&#xff08;parame…

基于Linux的HTTP代理服务器搭建与配置实战

在数字化世界中&#xff0c;HTTP代理服务器扮演着至关重要的角色&#xff0c;它们能够帮助我们管理网络请求、提高访问速度&#xff0c;甚至在某些情况下还能保护我们的隐私。而Linux系统&#xff0c;凭借其强大的功能和灵活性&#xff0c;成为了搭建HTTP代理服务器的理想选择。…

I2C基础协议详解

串口是传感器、外设常用的接口&#xff0c;在低速器件中可以通过串口传输数据。高速复杂的器件&#xff0c;往往内部存在很多寄存器&#xff0c;这些寄存器的配置一般也是采用串口通信&#xff0c;可以节省IO口。 常用串口大致分为UART、IIC、SPI三种&#xff0c;其中IIC时序稍…

unity学习案例总结

动态标签 GitHub - SarahMit/DynamicLabel3D: Simple dynamic labels for a 3D Unity scene

《乱弹篇(十三)明朝事儿》

2024年农历除夕夜&#xff0c;因追剧收看电视连续剧《后宫》而放弃了收看一年一度的《春晚》&#xff0c;至到春节&#xff08;农历正月初一&#xff09;晚才看完了《后宫》。 社交网站“必应”图片《后宫》 电视连续剧《后宫》&#xff0c; 讲的是明朝英宗末年的历史故事&…

【大厂AI课学习笔记】【1.5 AI技术领域】(10)对话系统

对话系统&#xff0c;Dialogue System&#xff0c;也称为会话代理。是一种模拟人类与人交谈的计算机系统&#xff0c;旨在可以与人类形成连贯通顺的对话&#xff0c;通信方式主要有语音/文本/图片&#xff0c;当然也可以手势/触觉等其他方式 一般我们将对话系统&#xff0c;分…

[算法学习]

矩阵乘法 只有当左矩阵列数等于右矩阵行数&#xff0c;才能相乘N*M的矩阵和M*K的矩阵做乘法后矩阵大小为N*k矩阵乘法规则&#xff1a;第一个矩阵A的第 i 行与第二个矩阵的第 j 列的各M个元素对应相乘再相加得到新矩阵C[i][j]的值 整除 同余 同余的性质 线性运算&#xff0c;…

【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱1(附带项目源码)

效果演示 文章目录 效果演示系列目录前言人物和视角基本控制简单的背包系统和物品交互绘制背包UI脚本控制 源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列&#xff01;本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第25篇中&#xff0c;我们将…

【c++基础】扑克牌组合

说明 小明从一副扑克牌中&#xff08;没有大小王&#xff0c;J认为是数字11&#xff0c;Q是12&#xff0c;K是13&#xff0c;A是1&#xff09;抽出2张牌求和&#xff0c;请问能够组合出多少个不相等的数&#xff0c;按照由小到大输出这些数。 输入数据 第一行是一个整数n代表…

2-8 单链表+双链表+模拟栈+模拟队列

今天给大家用数组来实现链表栈和队列 单链表&#xff1a; 首先要明白是如何用数组实现&#xff0c; 在这里需要用到几个数组&#xff0c;head表示头节点的下标&#xff0c;e[i]表示表示下标为i的值&#xff0c;ne[i]表示当前节点下一个节点的下标。idx表示当前已经用到那个点…

抛弃Spring Cloud Gateway,得物 使用Netty架构100Wqps网关

说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;很多小伙伴拿到一线互联网企业如阿里、网易、有赞、希音、百度、滴滴的面试资格。 最近&#xff0c;尼恩指导一个小伙伴简历&#xff0c;写了一个《高并发网关项目》&#xff0c;此项目帮这个小伙拿到 字节/阿里/…

线程池7个参数描述

所谓的线程池的 7 大参数是指&#xff0c;在使用 ThreadPoolExecutor 创建线程池时所设置的 7 个参数&#xff0c;如以下源码所示&#xff1a; public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable&…

检查链表是否回文

根据回文对称的特点&#xff0c;不难想到将链表分成前后两部分&#xff0c;然后将其中一部分反转的方法。 可以使用快慢指针的方式找到链表的中点&#xff0c;其中快指针每次移动两步&#xff0c;慢指针每次移动一步。当快指针到达链表末尾时&#xff0c;慢指针指向的位置即为链…

[LeetCode周赛复盘] 第 384 场周赛20240211

[LeetCode周赛复盘] 第 384 场周赛20240211 一、本周周赛总结100230. 修改矩阵1. 题目描述2. 思路分析3. 代码实现 100219. 回文字符串的最大数量1. 题目描述2. 思路分析3. 代码实现 100198. 匹配模式数组的子数组数目 II1. 题目描述2. 思路分析3. 代码实现 参考链接 一、本周…

前端JavaScript篇之ajax、axios、fetch的区别

目录 ajax、axios、fetch的区别AjaxAxiosFetch总结注意 ajax、axios、fetch的区别 在Web开发中&#xff0c;ajax、axios和fetch都是用于与服务器进行异步通信的技术&#xff0c;但它们在实现方式和功能上有所不同。 Ajax 定义与特点&#xff1a;Ajax是一种在无需重新加载整个…

【c++基础】国王的魔镜

说明 国王有一个魔镜&#xff0c;可以把任何接触镜面的东西变成原来的两倍——只是&#xff0c;因为是镜子嘛&#xff0c;增加的那部分是反的。 比如一条项链&#xff0c;我们用AB来表示&#xff0c;不同的字母表示不同颜色的珍珠。如果把B端接触镜面的话&#xff0c;魔镜会把…

小游戏和GUI编程(5) | SVG图像格式简介

小游戏和GUI编程(5) | SVG图像格式简介 0. 问题 Q1: SVG 是什么的缩写&#xff1f;Q2: SVG 是一种图像格式吗&#xff1f;Q3: SVG 相对于其他图像格式的优点和缺点是什么&#xff1f;Q4: 哪些工具可以查看 SVG 图像&#xff1f;Q5: SVG 图像格式的规范是怎样的&#xff1f;Q6…

中文GPTS详尽教程,字节扣子Coze插件使用全输出

今天&#xff0c;斜杠君和大家分享如何在字节扣子Coze中创建插件&#xff0c;并在创建后如何使用这个插件。 01 新建插件 首先&#xff0c;进入到插件页面&#xff0c;创建一个插件。 https://www.coze.cn/home 点击左侧的个人空间。 在上面选择”插件“标签&#xff0c;来到…

精灵图,字体图标,CSS3三角

精灵图 1.1为什么需要精灵图 一个网页中往往会应用很多小的背景图像作为修饰&#xff0c;当网页中的图像过多时&#xff0c;服务器就会频繁的接受和发送请求图片&#xff0c;造成服务器请求压力过大&#xff0c;这将大大降低页面的加载速度。 因此&#xff0c;为了有效地减少…