
System V IPC
这里我们介绍的这种通信方式也就是 system V IPC 在我们后面的使用和日常见到的其实并不多,但是包括其中的共享内存、消息队列、信号量,我们如果了解共享内存其原理的话,能够更好的帮助我们了解之前我们学过的进程地址空间的概念! 至于信号量,我们后面讲多线程的时候会再次讲,我们只引入一些概念如互斥等等,而消息队列我们就只说说其原理,不会细讲! 之前我们学过管道通信,分为匿名管道和命名...

这里我们介绍的这种通信方式也就是 system V IPC 在我们后面的使用和日常见到的其实并不多,但是包括其中的共享内存、消息队列、信号量,我们如果了解共享内存其原理的话,能够更好的帮助我们了解之前我们学过的进程地址空间的概念! 至于信号量,我们后面讲多线程的时候会再次讲,我们只引入一些概念如互斥等等,而消息队列我们就只说说其原理,不会细讲! 之前我们学过管道通信,分为匿名管道和命名...

有了匿名管道的知识,命名管道对我们来说就不是很难了! 匿名管道应用的一个限制就是只能在具有共同祖先(具有亲缘关系)的进程间通信。如果我们想在不相关的进程之间交换数据,可以创建和使用 FIFO 文件来做这项工作,它经常被称为命名管道。 命名管道既可以在命令行上创建,也可以在程序中创建! <img src"../../img/image20230206221959457.png" al...

管道是 Unix 中最古老的进程间基于文件系统通信的形式。我们把从一个进程连接到另一个进程的一个数据流称为一个 “管道”。注意管道是单向连通的,不存在说双向管道,就像生活中水往低处流而不会往高处流一样! <img src"../../img/image20230206100445074.png" alt"image20230206100445074" style"zoom:67%;" / ...
之前我们学习了进程以及基础IO的相关知识,所以进程之间我们知道都是具有独立性的(通过写时拷贝和虚拟地址空间),那么如果我们今天想让不同的进程之间进行资源的交互,也就是说进程A想看到进程B发过来的信息并及时接收它,那么我们仔细想想这不就是和进程的独立性相违背了吗 ❓❓❓ 因为我们之前说,如果打开一个文件,并且父进程创建了子进程,那么子进程其实就会拷贝父进程的大部分属性和内容,包括文件描述符表...

在学进程等待的时候我们用 wait 和 waitpid 函数清理僵尸进程,父进程可以阻塞等待子进程结束,也可以非阻塞地查询是否有子进程结束等待清理(也就是轮询的方式)。采用第一种方式,父进程阻塞了就不能处理自己的工作了;采用第二种方式,父进程在处理自己的工作的同时还要记得时不时地轮询一 下,程序实现复杂。 其实,子进程在终止时会给父进程发 SIGCHLD 信号,该信号的默认处理动作是...

这是一个从C语言就有的关键字,但是我们一直没有涉及到,就是因为其实这个 volatile 关键字是和信号挂钩的,要了解它必须知道了信号的知识,现在我们对信号有了基本的认知,下面我们来看一段代码: 可以看到运行结果很正常,符合我们的预期,当我们使用 ctrl+c 的时候信号捕捉后将 quit 从 1 变成了 0,这看起来没什么啊,但是这个时候我们在 makefile 中...

main 函数调用 insert 函数向一个链表 head 中插入节点 node1,插入操作分为两步,刚做完第一步的时候,因为硬件中断使进程切换到内核,再次回用户态之前检查到有信号待处理,于是切换到 sighandler 函数,sighandler 也调用 insert 函数向同一个链表 head 中插入节点 node2,插入操作的两步都做完之后从 sighandler 返回内核态,再次回到用...

还记得我们上面讲过的 sigsett 类型吗,sigsett 类型对于每种信号用一个 bit 表示 “有效” 或 “无效” 状态,至于这个类型内部如何存储这些 bit 则依赖于系统实现,从使用者的角度是不必关心的,因为不同的操作系统可能对 sigsett 变量的定义不一样,有的可能是变量,有的可能是数组,有的可能是封装在结构体内等等。 使用者只能调用以下函数来操作 sigsett 变...

在讲信号集的操作之前,我们先来讲讲信号的捕捉原理和内核态、用户态的知识,帮助我们后面的理解! 我们知道,信号产生的时候并不会立刻被处理,而是在一个合适的时候才会被处理!这里的合适的时候指的是什么呢❓❓❓ 一个信号产生,对应的 pending 位图某个位置就被置 1 了,但是不仅仅是受该信号是否被阻塞而才会被处理,其实还有原因,是因为系统需要进行用户态与内核态之间的身...

实际执行信号的处理动作称为信号递达(Delivery)。 信号从产生到递达之间的状态,称为信号未决(Pending)。 进程可以选择阻塞 (Block)某个信号。 被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作。 注意,阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作。 😁注意:阻塞信号和我们以前学...