Linux高并发服务器开发(四)进程间通信

devtools/2024/10/22 4:51:28/

文章目录

  • 1 前言
  • 2 无名管道
  • 3 有名管道
  • 4 管道读写特点
  • 5 设置管道为非阻塞
  • 6 使用有名管道实现简单版本聊天
  • 7 共享存储映射
    • 7.1 mmap 存储映射函数
    • 7.2 共享映射实现父子进程通信
    • 7.3 共享映射实现无亲缘关系进程通信
    • 7.4 匿名映射实现父子进程通信
  • 8 信号
    • 8.1 概念和特点
    • 8.2 信号的编号
    • 8.3 信号的四要素
    • 8.4 信号的状态 阻塞信号集和未决信号集
    • 8.5 信号产生函数
      • KILL
      • raise
    • 8.6 信号捕捉 signal(避免使用)
    • 8.7 信号集和信号集操作函数 PCB
    • 8.8 sigprocmask 函数
    • 8.9 获取未决信号集
    • 8.10 信号处理方式
    • 8.11 信号捕捉 sigaction
    • 8.12 sigqueue
    • 8.13 不可重入,可重入函数
    • 8.14 使用信号避免僵尸进程


1 前言

进程是独立的资源分配单元,不同进程之间的资源是独立的,不能直接在一个进程中直接访问另一个进程的资源。
在这里插入图片描述
主要通信机制
在这里插入图片描述

2 无名管道

在这里插入图片描述
在这里插入图片描述
无名管道的创建 pipe函数,fd[0]用于读fd[1]用于写
在这里插入图片描述

父子进程通过无名管道通信

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
管道是阻塞的,如果是子进程先执行,则会阻塞

3 有名管道

有名字,可以在无亲缘关系的进程间通信。
在这里插入图片描述
创建管道(通过命令)
在这里插入图片描述
创建管道(通过函数 mkfifo)

在这里插入图片描述
在这里插入图片描述
有名管道的读写

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
测试
在这里插入图片描述
在这里插入图片描述

4 管道读写特点

在这里插入图片描述
四种情况:
1.写端没关闭,管道中没有数据,这时候都管道进程读管道,会发生阻塞。
如果写端没有关闭,管道中有数据,读管道会将数据读出,下次读没有数据就会阻塞。
2. 所有写端关闭,读进程读管道内容,读取全部内容,最后返回0
3. 所有读端没有关闭,管道写满了,写管道进程写管道会被阻塞。
4. 所有的读端被关闭,写管道进程写管道会收到一个信号,然后退出。
5. 在这里插入图片描述
看管道大小
ulimit -a
在这里插入图片描述
查看管道缓冲区函数
在这里插入图片描述
在这里插入图片描述
设置管道为非阻塞

5 设置管道为非阻塞

在这里插入图片描述
在这里插入图片描述

6 使用有名管道实现简单版本聊天

使用两个管道

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
另一个talker把读写管道交换一下

可以使用多进程,子进程读,父进程写。

7 共享存储映射

在这里插入图片描述

7.1 mmap 存储映射函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意事项
在这里插入图片描述

7.2 共享映射实现父子进程通信

在这里插入图片描述
在这里插入图片描述

7.3 共享映射实现无亲缘关系进程通信


在这里插入图片描述

7.4 匿名映射实现父子进程通信

在这里插入图片描述
在这里插入图片描述

8 信号

8.1 概念和特点

中断:某一个信号产生时,处理信号时,对原来处理的事情进行暂停,并执行信号相应的函数,执行后再即系进行原来处理的事情
在这里插入图片描述
是一个异步的事情

在这里插入图片描述
信号可以直接进行用户控件进程和内核空间进程的交互,内核进程可以利用信号通知用户进程发生了什么系统事件。

8.2 信号的编号

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

8.3 信号的四要素

1)编号 2)名称 3)事件 4)默认处理动作
在 man 7 signal中查看
在这里插入图片描述
在这里插入图片描述

8.4 信号的状态 阻塞信号集和未决信号集

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

8.5 信号产生函数

KILL

在这里插入图片描述

raise

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8.6 信号捕捉 signal(避免使用)

函数指针

在这里插入图片描述
sighandler_t 就是返回值为void ,参数为int的函数
返回函数指针,第一个信号,第二个函数指针变量(回调函数,void返回值,int为参数)
在这里插入图片描述
在这里插入图片描述
避免使用这个,应该使用sigaction
在这里插入图片描述
捕捉定时器,使用signal
在这里插入图片描述

8.7 信号集和信号集操作函数 PCB

在这里插入图片描述

未决信号集,阻塞信号集
在这里插入图片描述

未决信号集不能设置,只能读。阻塞信号集可以设置。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8.8 sigprocmask 函数

信号阻塞集
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8.9 获取未决信号集

在这里插入图片描述

在这里插入图片描述

8.10 信号处理方式

在这里插入图片描述

在这里插入图片描述

8.11 信号捕捉 sigaction

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
新的
在这里插入图片描述
在这里插入图片描述

8.12 sigqueue

在这里插入图片描述

8.13 不可重入,可重入函数

在这里插入图片描述
信号处理函数应该是可重入函数

8.14 使用信号避免僵尸进程

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


http://www.ppmy.cn/devtools/57061.html

相关文章

antfu/ni 在 Windows 下的安装

问题 全局安装 ni 之后,第一次使用会有这个问题 解决 在 powershell 中输入 Remove-Item Alias:ni -Force -ErrorAction Ignore之后再次运行 ni Windows 11 下的 Powershell 环境配置 可以参考 https://github.com/antfu-collective/ni?tabreadme-ov-file#how …

计算机网络——数据链路层(点对点协议PPP)

点对点协议PPP的概述 对于点对点的链路,目前使用得最广泛的数据链路层协议是点对点协议 PPP (Point-to-Point Protocol)。 它主要应用于两个场景: 用户计算机与ISP之间的链路层协议就是点对点协议 PPP,1999年公布了回以在以太网上运行的PPP协…

【FFmpeg】关键结构体的初始化和释放(AVFormatContext、AVIOContext等)

目录 1.AVFormatContext1.1 初始化(avformat_alloc_context)1.2 释放(avformat_free_context) 2.AVIOContext2.1 初始化(avio_alloc_context)2.2 释放(avio_context_free) 3. AVStre…

rust + mingw安装教程

0. 说明 windows上安装rust时,需要在电脑上安装C/C构建工具。推荐的的两种工具链可以选择: visual studio build toolsmingw 官方推荐使用visual studio,若你的电脑上已经安装了visual studio,则无需再安装,直接安装…

轻度图像处理工具,匹敌photoshop

一、简介 1、一款功能强大的在线图片编辑工具,用户可以将其安装为渐进式网页应用(PWA)。它提供了与 Photoshop 相似的核心功能,能够满足大多数图像编辑需求,非常适合那些不愿或无法安装 Photoshop 的用户。即使使用免费版本,用户也能享受所有功能,是轻度图像处理的理想选…

Celery入门教程

一.Celery介绍 1.Celery架构 Celery架构基于可插拔组件(pluggable components)和根据选择的消息传输(代理)(message transport(broker))协议实现的消息交换机制。 2.Celery模块 (1)任务模块 Task 包含异…

Linux多进程和多线程(一)-进程的概念和创建

进程 进程的概念进程的特点如下进程和程序的区别LINUX进程管理 getpid()getppid() 进程的地址空间虚拟地址和物理地址进程状态管理进程相关命令 ps toppstreekill 进程的创建 并发和并行fork() 父子进程执行不同的任务创建多个进程 进程的退出 exit()和_exit() exit()函数让当…

实现Java中的图像处理功能

实现Java中的图像处理功能 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!在本篇文章中,我们将探讨如何在Java中实现图像处理功能。图像处理是计算机…