欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 国际 > Linux高并发服务器开发(四)进程间通信

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

2024/12/26 11:52:00 来源:https://blog.csdn.net/Lmz_0314/article/details/139967676  浏览:    关键词:Linux高并发服务器开发(四)进程间通信

文章目录

  • 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 使用信号避免僵尸进程

在这里插入图片描述

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com