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

Linux学习-软件编程(进程间通信1)

1.概念

  • 进程空间是独立的,包含文本段、数据段和系统数据段
  • 多个进程没有共享的用户空间,进程是操作系统资源分配的最小单元
  • 可以利用Linux内核实现多个进程间的通信

2.进程间通信常用的方式

2.1 传统Unix系统中的通信方式

  • 管道
  • 信号

2.2 SYS V分支中的通信方式

  • 消息队列
  • 共享内存
  • 信号灯

2.3 BSD分支中的通信方式

  • 本地域套接字

3.管道

3.1 分类

  • 有名管道
  • 无名管道

3.2 无名管道

原理

  • 无名管道是一段内核缓存区
  • 父进程通过pipe创建无名管道
  • 只有该父进程的子进程才能继承得到这俩个文件描述符,才能实现通信
  • 只能用于有亲缘关系的进程间通信

函数接口

pipe

原型:int pipe(int pipefd[2]);
功能:创建一个无名管道(内核缓存区)pipefd[0]:读管道的文件描述符pipefd[1]:写管道的文件描述符
返回值:成功返回0失败返回-1

管道操作特性

1.管道中至少有一个写端:

  • 读取数据时,如果管道中有数据则直接读出
  • 读取数据时,如果管道中没有数据则阻塞等待有数据写入才能读

2.管道中没有写端:

  • 读取数据时,管道中没有数据则直接读出
  • 读取数据时,管道中没有数据不阻塞等待直接向下执行

3.管道中至少有一个读端:

  • 写入数据时,如果管道没有写满则直接写入
  • 写入数据时,如果管道存满则阻塞等待有数据读出才能继续写入

4.管道中没有读端

  • 写入数据时,会产生管道破裂的信号导致进程任务异常退出

3.3 有名管道

与无名管道区别

  • 有名管道有名字,可以通过名字找到该管道
  • 可以用于任意进程间通信
  • 进程间通信最简单、易实现的方式

操作方式

  • 进程一使用open以读、写、读写方式打开管道文件
  • 进程二使用open以读、写、读写方式打开管道文件
  • 两个进程可以通过向管道文件中读写数据实现进程的通信

函数接口

原型:int mkfifo(const char *pathname, mode_t mode);
功能:创建有名管道
参数:pathname:管道文件名mode:权限
返回值:成功返回0失败返回-1

4.信号

4.1 概念

  • Linux系统中的信号主要是实现应用层和内核层之间的信号通知
  • 应用层与内核层之间通信的信号根据含义分为很多不同的信号
  • 信号主要用于多个进程任务间的事件通知
  • 信号可以用于异步通信

4.2 信号的类型

  • 使用kill -l查看信号类型
linux@ubuntu:~$ kill -l1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX	SIGINT:中止信号(可以从键盘输入)     ctrl + c
SIGQUIT:退出信号(可以从键盘输入)    ctrl + \
SIGKILL:杀死进程信号
SIGSEGV:段错误信号
SIGPIPE:管道破裂信号
SIGALRM:定时时间到达信号
SIGCHLD:子进程结束,父进程回收到该信号
SIGCONT:继续执行进程任务
SIGSTOP:停止进程任务
SIGTSTP:挂起信号(可以从键盘输入)    ctrl + z
SIGIO:异步IO信号

4.3 信号处理方法

  • 缺省:信号来了,按照默认方式处理
  • 忽略:信号来了,不处理信号,忽略信号
  • 捕捉:信号来了,按照自定义的方式处理信号

注意:

  • 9号信号(SIGKILL)和19号信号(SIGSTOP)不能被忽略和捕捉

4.4 函数接口

signal

原型:
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
功能:设置signum对应的处理方式
参数:signum:信号的编号handler:信号的处理方式SIG_IGN:忽略信号SIG_DFL:缺省处理信号
返回值:成功返回之前处理信号的方式失败返回SIG_ERR

alarm

原型:unsigned int alarm(unsigned int seconds);
功能:设置一个定时,过seconds秒后,给进程发送SIGALRM信号
参数:seconds:秒数
返回值:成功返回上次定时剩余的秒数如果之前没有定时返回0

kill

原型:int kill(pid_t pid, int sig);
功能:给pid对应的进程发送sig信号
参数:pid:进程的ID号sig:信号的编号
返回值:成功返回0失败返回-1
http://www.dtcms.com/a/337721.html

相关文章:

  • ROS 2 中用于建图的一些 topic
  • PyTorch神经网络工具箱(优化器)
  • buuctf:护网杯_2018_gettingstart、oneshot_tjctf_2016
  • llamafactory使用qlora训练
  • VectorDB+FastGPT一站式构建:智能知识库与企业级对话系统实战
  • 使用LLaMA-Factory对大模型进行微调-详解
  • OSG+Qt —— 笔记2- Qt窗口绘制棋盘及模型周期运动(附源码)
  • linux:告别SSH断线烦恼,Screen命令核心使用指南
  • 第四章:大模型(LLM)】07.Prompt工程-(1)Prompt 原理与基本结构
  • 大数据分析-读取文本文件内容进行词云图展示
  • Zephyr 中的 bt_le_per_adv_set_data 函数的介绍和应用方法
  • [机器学习]09-基于四种近邻算法的鸢尾花数据集分类
  • 具身智能赋能轮椅机器人的认知革命与人机共生新范式
  • 【软考架构】第4章 信息安全的抗攻击技术
  • 从「行走」到「思考」:机器人进化之路与感知—决策链路的工程化实践
  • 微电网管控系统中python多线程缓存与SQLite多数据库文件连接池实践总结(含源码)
  • 安川YASKAWA焊接机器人保护气智能节气阀
  • 蓝牙 GFSK RX Core 架构解析
  • Linux下的软件编程——IPC机制
  • 重复(Repeat)和迭代(Iteration)区别、递归(Recursion)
  • 超级云平台:重构数字生态的“超级连接器“
  • 想找出版社出书?这样选就对了!
  • 哈工深无人机目标导航新基准!UAV-ON:开放世界空中智能体目标导向导航基准测试
  • 【论文阅读】-《GeoDA: a geometric framework for black-box adversarial attacks》
  • 基于Flink CDC实现联系人与标签数据实时同步至ES的实践
  • 后台管理系统-6-vue3之mockjs模拟和axios请求数据
  • python UV虚拟环境项目搭建
  • 和芯星通携手思博伦通信,测试验证系列导航定位芯片/模块符合GB/T 45086.1标准
  • 学习stm32 感应开关盖垃圾桶
  • 用 Python 实现一个“小型 ReAct 智能体”:思维链 + 工具调用 + 环境交互