Linux进程间通信学习笔记

2026年摩尔线程数字IC面试试卷带答案 本文摘要: 该试卷为数字IC设计笔试,满分120分,时长90分钟,包含单选题、波形分析题、多选题和代码设计题。重点考察时序约束(如set_false_path)、建立/保持时间、逻辑化简、复位机制、AXI协议、半导体工艺、状态机、GPU架构等核心知识点。多选题涉及异步FIFO设计、Verilog综合、亚稳态处理、C++关键字和低功耗技术。代码题要求实现单比特信号去毛刺电路,需稳定4个时钟周期才输出。试题解析详细,标注了企业面试高频考点,如摩尔线程自研的MUSA架构和花港GPU架构特点。整体内容专业性强,覆盖 阅读详情

进程间通信

进程间通信(IPC)是指在不同进程之间传播或交换信息

IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信息量、共享存储、Socket、Streams等。其中Socket、Streams支持不同主机上的两个进程IPC

无名管道

通常指无名管道,是UNIX系统IPC最古老的形式

特点
  1. 半双工(只能同时进行一组读写),具有固定的读端和写端
  2. 只能用于具有亲缘关系的进程之间的通信(父子进程/兄弟进程)
  3. 可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write等函数。但它不是普通的文件,不属于其他任何文件系统,只存在内存中。
  4. 管道数据被读取,就没了
原型
#include <unistd.h>
int pipe(int fd[2]);		
//返回值:若成功返回0,失败返回-1

当一个管道建立时,其会创建两个文件描述符:

fd[0]为读而打开,fd[1]为写而打开 用close/write/read 操作

​ 读管道 会等到 管道内有数据再读

命名管道 FIFO

命名管道,是一种文件类型

特点
  1. FIFO可以在无关的进程之间交换数据,与无名管道不同
  2. FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中
原型

mode与open的mode相同。一旦创建FIFO,就可以用一般的文件I/O函数操作它

#include <sys/types.h>
#include <sys/stat.h>

int mkfifo(const char *pathname, mode_t mode);

当open一个FIFO时,是否设置非阻塞标志(O_NONBLOCK)的区别

  • 若没指定O_NOBLOCK(默认),只读open要阻塞到某个其他进程为写而打开此FIFO。只写同理
  • 若制定了O_NONBLOCK,则只读open立即返回。而只写open将出错返回-1。如果没有进程已经为读而打开该FIFO,其errno置ENXIO。

消息队列

消息列表,是消息的链接表,存放在内核中。一个消息队列由一个标识符(即队列ID)来标识。

特点
  1. 消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级
  2. 消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除
  3. 消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取
原型
#include <sys/msg.h>
int msgget(key_t key, int msgflg);
//创建或打开消息队列:成功返回队列ID,失败返回-1
//flg 中还要包括权限


int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
//添加消息:成功返回0,失败返回-1

size_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);
//读取消息:成功返回消息数据长度,失败返回-1

int msgctl(int msqid, int cmd, struct msqid_ds *buf);
//控制消息队列:成功返回0,失败返回-1
//msgctl可以清除消息队列  IPC_RMID

在以下两种情况下,msgget将创建一个新的消息列表:

  • 如果没有与键值key相对应的消息队列,且flag中包含了IPC_CREAT标志位
  • key参数为IPC_PRIVATE
ftok

系统IPC键值的格式转换函数

系统建立IPC通讯(消息队列、信号量和共享内存)时必须指定一个ID值。通常情况下,该id值通过ftok函数得到。

#include <sys/types.h>
#include <sys/ipc.h>

key_t ftok(const char *pathname, int proj_id);

共享内存

  1. 创建/打开共享内存
  2. 映射
  3. 数据操作
  4. 释放共享内存
原型
#include <sys/shm.h>

int shmget(key_t key, size_t size, int shmflg);
//创建或获取一个共享内存:成功返回共享内存ID,失败返回-1

void *shmat(int shmid, const void *shmaddr, int shmflg);
//连接共享内存到当前进程的地址空间:成功返回指向共享内存的指针,失败返回-1

int shmdt(const void *shmaddr);
//断开与共享内存的连接:成功返回0,失败返回-1

int shmctl(int shmid, int cmd, struct shmid_ds *buf);
//控制共享内存的相关信息:成功返回0,失败返回-1
//IPC_RMID

共享内存大小必须以兆(1024)对齐

信号

对于Linux来说,实际信号是软中断

信号的处理方式有三种:忽略、捕捉、默认动作

  • 忽略信号,大多数信号能使用这种方式处理,但有两种不能被忽略(SIGKILL和SIGSTOP)
  • 捕捉信号,写一个信号处理函数,告诉内核
  • 默认动作,man 7 signal

ps -aux|grep XXX 查看进程

kill -9 数字 杀死进程

信号处理函数的注册

入门函数:signal

发:kill() 操作函数:signal()

#include <signal.h>

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_thandler);
//SIG_IGN 忽略

高级函数:sigaction

收信号:1.用什么绑定函数 2.如何读出消息

#include <signal.h>

int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);
//oldact  做备份

struct sigaction {
void     (*sa_handler)(int);
//配置信号处理程序,不接受任何数据,SIG_IGN为忽略   
void     (*sa_sigaction)(int, siginfo_t *, void *);
//配置信号处理程序,能够接收额外数据
//配置1.num  2.结构体 3.指针(NULL无数据 非NULL有数据)
//2.结构体 pid谁发 int数据
sigset_t   sa_mask;
//阻塞关键字的信号集,可以再调用捕捉函数之前,把信号添加到信号阻塞
int        sa_flags;
//影响信号的行为	   SA_SIGINFO标识能够接收数据
};

发信号:1.用什么发 2.怎么放入消息

sigqueue

#include <signal.h>

int sigqueue(pid_t pid, int sig, const union sigval value);

union sigval {
int   sival_int;
void *sival_ptr;
};

信号处理发送函数

信号量

是一个计数器,用于实现进程间的互斥与同步,而不是用于存储进程间通信数据

特点
  1. 信号量用于进程间同步,若要在进程间传递数据需要结合共享内存
  2. 信号量基于操作系统的PV操作,程序对信号量的操作都是原子操作
  3. 每次对信号量的PV操作不仅限于对信号量值加1或减1,可以加减任意正整数
  4. 支持信号量组
临界资源

多道程序系统中存在许多进程,它们共享各种资源,然而有很多资源一次只能供一个进程使用。一次仅允许一个进程使用的资源称为临界资源。

信号量集
P操作:拿锁 semop
V操作:放锁 semop
原型

Linux下的信号量函数都是在通用的信号量数组上进行操作,而不是在一个单一的二值信号量上进行操作

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

int semget(key_t key, int nsems, int semflg);
//创建或或获取一个信号量组:成功返回信号量集ID,失败返回-1

int semop(int semid, struct sembuf *sops, unsigned nsops);
//对信号量组进行操作,改变信号量的值:成功返回0,失败返回-1

int semctl(int semid, int semnum, int cmd, ...);
//控制信号量的相关信息 cmd初始化SETVAL
					//cmd销毁IPC_RMID

struct sembuf
{
unsigned short sem_num;  /* 信号量集中的第几个信号量 */
short          sem_op;   /* +- 锁*/
short          sem_flg;	/*SEM_UNDO维护进程对信号量的调整值*/
}

union semun {
int              val;    /* Value for SETVAL */
struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
unsigned short  *array;  /* Array for GETALL, SETALL */
struct seminfo  *__buf;  /* Buffer for IPC_INFO(Linux-specific) */
};//semctl第四个参数 设置val(锁的数量)

机器学习算法 —— LightGBM 本次我们选择英雄联盟数据集进行LightGBM的场景体验。英雄联盟是2009年美国拳头游戏开发的MOBA竞技网游,在每局比赛中蓝队与红队在同一个地图进行作战,游戏的目标是破坏敌方队伍的防御塔,进而摧毁敌方的水晶枢纽,拿下比赛的胜利。现在共有9881场英雄联盟韩服钻石段位以上的排位比赛数据,数据提供了在十分钟时的游戏状态,包括击杀数、死亡数、金币数量、经验值、等级……参考项目:机器学习系列入门系列[七]:基于英雄联盟数据集的LightGBM的分类预测。 阅读详情

相关推荐

Harness设计——Anthropic实战:规划器、生成器、评估器三角色协作详解

本文探讨了如何通过多智能体架构突破AI编码的瓶颈问题。文章首先分析了当前AI编码面临的两大核心挑战:上下文窗口限制导致的连贯性丧失,以及自我评估机制缺失引发的质量判断偏差。针对这些问题,作者提出了基于生成对抗网络(GAN)灵感的解决方案,设计了三智能体系统:规划器负责需求分析,生成器执行编码任务,评估器进行质量审查。 实验表明,在前端设计任务中,通过制定可量化的评分标准(设计质量、原创性、工艺、功能性)并建立生成-评估反馈循环,能显著提升输出质量。这种架构随后被扩展到全栈开发领域,采用类似敏捷开发的&quo

oe1019的专栏 867

C++程序员面试题库(六)——操作系统

操作系统1、进程和线程的概念;为什么要有进程线程;进程和线程的区别;它们各自是怎么同步的2、并发和并行 1、进程和线程的概念;为什么要有进程线程;进程和线程的区别;它们各自是怎么同步的   基本概念:   进程是对运行时程序的封装,是系统进行资源调度和分配的基本单位,实现了操作系统的并发。   线程是进程的子任务,是CPU调度和分派的基本单位,用于保证程序的实时性,实现进程内部的并发;线程是操作系统可识别的最小执行和调度单位,每个线程独自占有一个虚拟处理器:独自的寄存器组,指令计数器和处理器状态。进程中的每

AlanfengLiu的博客 611

rk3326 MIPI休眠唤醒黑屏有背光问题

** 1.问题现象: ** **【开机起来】**开机起来可以正常显示 **【按power按键休眠】**第二次按下Power按键进入休眠,隔10s,再按Power按键唤醒。 **【出现结果】**屏幕黑屏有背光,并提示drm time out错 **【lcd信息】**lcd为480*800 2lane的mipi **【复现概率】**第二次按下休眠唤醒必然复现 【具体错误log如下】 //第一次休眠的log// [ 54.858511] dw-mipi-dsi ff450000.dsi: final DSI-

Ian22l的博客 3944

学习笔记——进程间通信之信号量

重点来了!!!我们先看看PV同步和互斥等基本概念。。。进程在运行过程中,一般会与其他的进程共享资源,而有些资源具有排他性。一次只能为一个进程所使用,通常把这种一次仅允许一个进程使用的资源称为临界资源(如:打印机、绘图机、一些进程间共享的变量、缓存区)。进程访问临界资源的那段代码称为临界区,也叫临界段。访问临界资源应遵循如下原则:1、空闲让进(或有空即进):当进程处于临界区时,可以允许一个请求进出临界区的进程立即进出自己的临界区。2、忙则等待(或无空则等):当已有进程进入临界区时,其他试图进入临界区的进程必须

打不倒的程序猿 3100

告别混乱接线!用EPLAN 3D布局图,手把手教你搞定电气柜的3D建模与自动布线

本文详细介绍了如何使用EPLAN 3D布局图进行电气柜的3D建模与自动布线,帮助工程师告别混乱接线。从项目准备、基础结构建模到智能设备布局与逻辑定义,再到高级布线技术与问题排查,提供了一套完整的实战指南。通过EPLAN的3D功能,显著提升设计效率与系统可靠性。

weixin_30680385的博客 340

【GPIO模拟串口通信协议】

由于这段时间搞了个安卓相关的项目,需要和安卓进行Uart通信。但是选用的芯片并没有自带uart功能,所以在充分评估项目后,考虑波特率不高的情况下,决定使用GPIO去模拟串口通信协议了。

学海无涯苦作舟 2638

进程间通信方式

进程通信的方式主要有: 1.管道 2.命名管道 3.信号 4.消息队列 5.共享内存 6.信号量 7.套接字 补充: 1、2、3、5、6 一般是用于同一机器中不同进程间的通信, 4、7可以实现不同机器之间不同进程间的通信。 进程通信:管道 管道,通常指的是无名管道。 它是半双工的,即数据只能在一个方向上流动,具有固定的读端和写端。 它只能用于具有亲缘关系的进程之间进行通信,如父子进程或者兄弟进程...

蹊源的奇思妙想的博客 2039

用python画带有正负值的条形图

常见的条形图只能表现数据的大小,却不能表现值的正负关系。但是其实仅仅使用`pandas`和`matplotlib`两个包就可以实现y轴负轴的添加以及负值的显示,并且可以为正负值分别设置不同的颜色,让条形图看上去更加清晰,易于我们分析

weixin_44853840的博客 5384

操作系统面试题(一)

● 请你说一下进程与线程的概念,以及为什么要有进程线程,其中有什么区别,他们各自又是怎么同步的 参考回答: 基本概念: 进程是对运行时程序的封装,是系统进行资源调度和分配的的基本单位,实现了操作系统的并发; 线程是进程的子任务,是CPU调度和分派的基本单位,用于保证程序的实时性,实现进程内部的并发;线程是操作系统可识别的最小执行和调度单位。每个线程都独自占用一个虚拟处理器:独自的寄存器组,...

weixin_30325487的博客 3048

基于Simulink的单级式光伏并网系统MPPT控制仿真

本文基于Simulink平台,详细介绍了单级式光伏并网系统的MPPT控制仿真实现。主要内容包括:1)阐述MPPT作为光伏系统"智能大脑"的核心作用;2)解析单级式系统架构及扰动观察法(P&O)算法原理;3)以10kW户用系统为例,分步骤演示建模过程,包括光伏阵列搭建、P&O控制器实现(含MATLAB代码)、并网控制设计等;4)通过仿真验证系统在光照突变下的动态响应性能,MPPT效率达98.3%。文章还提出了变步长P&O等优化方向,为光伏系统仿真与控制提供实用指导。

xiaoheshang_123的博客 111

从权限对象到业务角色:把 SAP Authorization Object 讲清楚,并用 ABAP 写对一次 AUTHORITY-CHECK

摘要:SAP权限管理的核心在于Authorization Object(授权对象),它通过组合最多10个授权字段来精确控制用户访问权限。关键要点包括:1) 授权对象与ACTVT字段(如01创建/02修改/03显示)的配合使用;2) ABAP中AUTHORITY-CHECK语句的四种常见返回码(0通过/4字段不匹配/12无权限/40无效用户);3) 系统自动执行的S_TCODE事务码检查;4) 自定义授权对象时应遵循"最少且足够"原则,优先复用标准对象。在RAP和OData场景中,权限检查

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 266

【Linux学习笔记】进程间通信之共享内存

本文介绍了Linux进程间通信中的共享内存机制。主要内容包括System V共享内存的原理、数据结构和相关函数(shmget、shmat、shmdt、shmctl)的使用方法。通过示例代码演示了客户端和服务器端如何通过共享内存实现通信,并提出了借助管道实现访问控制的改进方案。共享内存是Linux中高效的IPC方式,可以实现进程间的快速数据交换。文章还提供了详细的代码实现,包括共享内存的创建、连接、读写和销毁过程。

大白的编程日记. 716

英飞凌Tricore实战系列导读

笔者结合项目应用经验对Tricore MCU的开发及应用经验进一步总结,成人达己,渡己渡人。

initiallizer的博客 3791

【Linux学习笔记】进程间通信之管道通信

本文介绍了Linux进程间通信中的管道通信机制,重点讲解了匿名管道的原理和使用方法。主要内容包括:进程间通信的目的(数据传输、资源共享等)和发展历程;管道的概念及其分类(匿名管道和命名管道);匿名管道的创建、读写规则和特点(半双工、原子性等);并通过代码示例展示了父子进程间通过管道通信的实现过程。最后还提出了基于管道的进程池框架,为后续更复杂的进程通信机制学习奠定了基础。管道作为Unix最古老的IPC方式,适用于具有亲缘关系的进程间通信。

大白的编程日记. 1156

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Linux学习笔记——进程间通信

单进程无法使用并发的能力,更无法实现多进程协同工作,所以进程间通信时一种手段,目的是要实现多进程协同。

weixin_55051736的博客 1163

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Linux C学习笔记——进程间通信

8.1 进程间通信概述 进程间通信(Inter-Process Communication, IPC)是指在两个或者多个不同的进程间传递或者交换信息,通过信息的传递建立几个进程间的联系,协调一个系统中的多个进程之间的行为。 8.1.1 进程间通信的工作原理 进程与进程之间是相互独立的,各自运行在自己的虚拟内存中。要想在进程与进程之间建立联系,需要通过内核,在内核中开辟一块缓冲区,两个进程的信

vinnyaptx4869的专栏 708

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Linux学习笔记8—进程间通信

Linux学习笔记8—进程间通信

CS_boy的博客 1678

linux 进程间通信学习笔记

阅读内容《深入理解Linux进程间通信》--Linux 阅码场共享内存:

181

【Linux编程学习笔记】进程间通信

内核提供的这种机制称为进程间通信(IPC, InterProcess Communication)1. 管道 pipe(使用最简单)2. 信号 signal(开销最小)3. 共享映射区 mmap(无血缘关系)4. 本地套接字 socket(最稳定)

maqian789的博客 736

Linux 进程间通信学习笔记

无名管道只能亲缘进程;有名管道 FIFO 任意进程都能用。写管道,但是所有读端全部关闭 → SIGPIPE 信号,进程直接死掉。写代码必须注意。信号是异步!进程不知道信号什么时候来。9、19 号信号不受程序控制。pipe 创建出来两个 fd,fork 之后子进程会复制文件描述符,父子各持有读写两端,记得不用的一端 close 关闭。pause 会一直睡,只有信号到来才会解除阻塞。

weixin_48445537的博客 627

Linux学习笔记(进程间通信)

进程间通信的概念 (IPC)进程间通信 Linux下的多个进程间的通信机制叫做IPC,它是多个进程之间进行相互沟通的一种方法。通过进程间通信可以实现不同进程之间传播和交换信息。 进程间通信的目的 1.数据传输 2.资源共享 3.一个进程需要向另一个或一组进程发送消息,通知它或它们发生了某种事件 4.进程控制 进程间通信的方式 在Linux下有多个进程间通信的方法:半双工管道、FIFO(命名管道)、...

bareheadedman的博客 248

Linux学习笔记】一篇文章彻底搞定 “Linux进程间通信“ !

当创建子进程的时候,子进程并不会继承父进程的文件系统,只会继承文件描述符表,此时仅仅是子进程的指向父进程的文件系统,此时就是浅拷贝,此时父子进程就做到了不同的进程,看到同一份资源(缓冲区,由操作系统提供的空间),struct file是允许多个进程通过指针指向我的!⭐所以基于文件的,让不同进程看到同一份资源的通信方式,就叫做管道!!!管道是Unix中最古老的进程间通信的形式。我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”⭐。

qq_64446981的博客 1392

linux应用层之进程间通信学习笔记

1. 什么是进程间通信 进程间通信就是在不同进程之间传播或交换信息 单机通信方式:半双工管道(无名管道,命名管道),全双工管道(命名全国双工管道),消息队列,信号量,共享内存 多级通信方式:套接字(基于网络),STREAMS 2. 什么是半双工,什么是全双工 半双工: 一方在发数据,另一方只能收数据;一方收数据,另一方只能发数据,双方不能同时发或收数据。就像赛尔号,烈焰猩猩和妙蛙种子对打,烈焰猩猩出招,妙蛙种子只能坐等挨打,反之亦然 全双工: 双方可以同时收发数据。就像王者荣耀,貂蝉打吕布时

weixin_43699365的博客 306

【Linux学习笔记】进程间通信之管道

在了解管道之前,我们先来了解下进程之间为什么需要通信。 1、进程间通信的目的 数据传输: 一个进程需要将它的数据发送给另一个进程 资源共享:多个进程之间共享同样的资源 通知事件: 一个进程需要向另一个或一组进程发送消息,通知它发什么了某种事件 进程控制:有些进程希望完全控制另一个进程的执行,此时控制进程希望能够拦截另一个所有陷入和异常,并能够及时知道它的状态。 那么为什么进程不直接...

blue丶的博客 392

学习笔记——Linux进程间通信(IPC)

本文系统介绍了Linux进程间通信(IPC)的三种主要方式:信号通信、管道通信和共享内存。信号通信采用异步通知机制,通过kill()发送信号和signal()处理信号;管道通信包括无名管道(pipe)和有名管道(mkfifo),前者用于亲缘进程,后者可用于任意进程;共享内存是最高效的IPC方式,通过shmget、shmat等函数实现内存共享。文章详细说明了每种方式的实现步骤、相关函数及特点,并强调了使用注意事项,包括信号处理简洁性、管道阻塞处理、共享内存同步机制等,为Linux进程间通信提供了全面的技术参考

2301_78295956的博客 981
上一篇: Linux进程学习笔记
下一篇: Linux线程学习笔记
fisheader
博客等级 码龄6年 7粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值