[Linux操作系统]进程间信号与进程间通信知识点总结

2 篇文章 0 订阅
1 篇文章 0 订阅

在这里插入图片描述

信号

1. 信号

信号源:键盘 ctrl+c ctrl+\,kill pid,操作系统,硬件
查看系统的信号: kill -l
信号来了之后如何处理:1 缺省处理 2 忽略 SIGKILL SIGSTOP不能忽略 3 抓住信号自己SIGKILL SIGSTOP
信号注册/信号安装:void(*signal (int sig,void (*handler)(int)))(int)
Bus错误:(读写内存即为读写磁盘 mmap 架设一条高速公路) 如果架设之后操作系统判断文件大小为0,则不会建设这条线,这条公路就没了 但mmap是成功的,因此这时候写内存即写磁盘,这条路就是不通的
在这里插入图片描述

2. 信号的分类

  • 不可靠信号:信号可能丢失
  • 可靠信号:多个信号不会丢失
  • 非实时信号:不可靠信号时非实时信号
  • 实时信号:可靠信号是实时信号
    时间:
    在这里插入图片描述

3. 并行和并发

并行:两个进程同时进行
并发:一会执行你,一会执行我

4. 信号处理函数

信号处理函数:在实际任务中做的事情要尽可能的少
信号处理函数执行期间,阻塞本信号。信号丢失现象,信号压缩。
我们敲出来的信号都给了内核,至于要给那个进程则是由内核来进行分配。
在这里插入图片描述
raise给自己发信号,等价于kill(getpid());
abort使接收到信号的进程直接结束void abort()没有返回值是因为肯定会成功
malloc每次分配空间:第一次分配后,如果第二次锁需要申请的空间没有大于有效的地址内容,则直接从第一次申请的内容中去取出(使用链表管理起来) 但是若多进程或多线程进行申请的话,则会出现内存已被使用的情况存在。

在这里插入图片描述
信号处理函数分为:

  • 不可重入函数:放在信号处理函数之中会出现问题(如链表的问题),如果是使用了静态变量(全局变量) 用了malloc/free,标准IO,printf都是不可入的
  • 可重入函数:放在信号处理函数之中不会出现问题
    在这里插入图片描述
    信号处理函数,这种方式可以让用户感受不到信号到来,更加舒适。

volatile 在信号中的作用:保持内存的可见性,告知编译器,被该关键字修饰的变量,不允许被优化,对该变量的任何操作,都必须在真实的内存中进行操作

5. 信号的内核

实际执行信号的处理动作称为信号递达,而从产生到递达的状态称之为信号未决。
进程可以阻塞某个信号,被阻塞得信号保持在未决状态,直到进程接触对此信号的阻塞,才执行递达的动作。阻塞和忽略不同,只要信号被阻塞就不会递达,而忽略是递达之后可选的一种处理冬作。
(信号的东西,子进程也会继承)
在这里插入图片描述
未决和阻塞标志可以用相同的数据类型sigset_t来存储,其被称为信号集,整个类型可以表示信号的有效或无效状态

使用sigprocmask函数讲内核中的block阻塞进行修改
how是在set和oldset都为飞空指针的时候来指示我们如何进行修改
在这里插入图片描述
多个sigset函数的功能:在使用sigset_t类型的变量之前一定要调用相关函数进行初始化
在这里插入图片描述
前四个函数成功返回0,出错返回-1,而第五个是布尔函数,用于判断一个信号集的有效信号中是否包含某种信号,若包含返回1,不包含返回0,错误返回-1
sigsuspend屏蔽之前所有信号,将自己的信号拉出来,结束之后又还原回之前屏蔽状态
在这里插入图片描述
信号的捕捉:sigaction功能会比signal功能更多一些
在这里插入图片描述
当某个信号的处理函数被调用时,内核自动将当前信号加入进程的信号屏蔽字,当信号处理函数返回时自动恢复原来的信号屏蔽字,这样就保证了在处理某个信号时,如果这种信号再次产生,那么 它会被阻塞到当前处理结束为止。 如果在调用信号处理函数时,除了当前信号被自动屏蔽之外,还希望自动屏蔽另外一些信号,则用sa_mask字段说明这些需要额外屏蔽的信号,当信号处理函数返回时自动恢复原来的信号屏蔽字。

进程间通信

进程间通信的目的:数据传递,资源共享,通知事件
三种方式:内核,文件,映射的物理空间
在这里插入图片描述

同步:多个进程相互配合来完成一件事情
互斥:一个资源访问时只能被一个访问,其他不能访问,称之为互斥

1. 文件锁

  1. 死锁
    在这里插入图片描述

哲学家就餐
在这里插入图片描述
2. PV操作
信号来的PV操作:信号量是一个计数器,大于零表示可用资源个数,等于零表示无可用资源,也没有人等待该资源,小于零表示没有资源可用,有|s|绝对值这么多进程在等待该资源
在这里插入图片描述
互斥的话,pv操作在同一个操作进程之中;同步的话,pv操作在两个操作进程之中。

  1. 管道:单向的,只能够从一个方向进,一个方向出 半双工(管道必须有一个祖先)
    在这里插入图片描述
    管道的读写:
    在这里插入图片描述
    管道的父子进程关系
    在这里插入图片描述
    非堵塞方式的读:当没有数据可读 read O_NONBLACK 返回 -1 errno =EAGAIN 堵塞的方式则会一直堵塞在哪里
    如果一直没有人读的话,会出现管道破裂的现象!
    匿名管道必须有亲缘关系之间的进程间通信(具有共同祖先)
    命名管道是为了不相关的进程之间交换数据,可以使用fifo文件来进行,称之为命名管道,是一种特殊类型的文件。创建命名管道mkfifo(“p2”,0644)和pipe之间唯一的区别在于他妈创建与打开的方式不同。

  2. 消息队列
    打开消息队列的时候,权限必须和创建消息队列时权限一模一样(若不知道则写0,系统会自动选择)
    在这里插入图片描述
    在这里插入图片描述
    结束后删除队列:
    在这里插入图片描述

查看创建的消息队列:ipcs -q
删除创建的消息队列:ipcrm -Q 队列编号
一个通道的消息队列大小:cat /proc/sys/kernel/msgmax
整个消息队列的总和:cat /proc/sys/kernel/msgmnb
一共可以创建多少个消息队列:cat /proc/sys/kernel/msgmni

  1. 共享内存和物理映射
    在这里插入图片描述
    共享内存(没有同步和互斥)
    在这里插入图片描述
    把文件映射到内存之中
    在这里插入图片描述
    共享内存函数:
    在这里插入图片描述

  2. 信号量
    在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值