Linux下的进程与线程(二)—— 信号
Linux进程之间的通信:
本文主要讨论信号问题。
在Linux下的进程与线程(一)中提到,调度器可以用中断的方式调度进程。
然而,进程是怎么知道自己需要被调度了呢?是内核通过向进程发送信号,进程才得以知道的。
Linux系统的进程之间是通过信号来通信的。
程序员在Shell上显式地发送信号使用的是kill命令,原型如下:
kill -sigid [-]pid
其中, sigid指示的是信号的id,pid前若有-,则pid代表的为进程组id,否则pid代表的为进程id
kill函数也有相同的作用,原型如下:
int kill(pid_t pid, int sig);
一个使用kill命令的典型例子如下:
我们在Linux的Shell上运行一个前台作业的时候,Shell会fork一个新的进程A,然后在这个新的进程中运行我们的作业。该前台作业在运行时也可能会fork子进程a,子进程b。
当我们按下Ctrl+C,Shell会收到一个SIGINT信号,然后Shell进程会转发这个信号到A,然后A再将这个信号转发到子进程a,子进程b。
通过这种转发的方式,实现信号传递。
下图摘自CS:APP(图8-27),在本书的举例中,前台作业运行的是 ls | sort,图示一目了然:

值得一提的是,当父进程创建子进程之后,父子进程的进程组ID(pgid)是相同的。
信号的等待与阻塞:
如果一个进程正在处理类型为k的信号,那么此时当另一个k信号到的时候,进程的pending位向量(待处理信号集)的第k位会被设置。但这个刚到的k信号不会被立即处理,直到handler程序返回。
如果此时又来了一个k信号,那么由于此前pending位向量已被设置,所以这个信号会被丢弃。
一旦进程接收了信号k,那么内核就会清除pending的第k位。
blocked位向量(被阻塞信号集)维护着进程阻塞的信号,在这里设置的信号不会被进程接收处理。
所以我们知道,pending & ~blocked 的结果指示了进程将要去接收处理的信号集。
信号中断慢速系统调用:
诸如read,wait,accept之类的慢速系统调用会阻塞进程,在特定的Solaris系统上,当被阻塞的进程被信号中断之后,将不会再返回。而是给用户一个错误条件,并对errno进行设置。
在Linux系统上,会自动重启被中断的系统调用.
为了使得编写的代码在Linux和Solaris系统上都能运行,需编写可移植性代码.
接收信号:
进程接收每一个信号之后都有默认的行为,比如接收SIGKILL信号后,进程被终止。
可以设置signal函数,来修改部分信号的默认行为:
sighandler_t signal(int signum, sighandler_t handler)
其中,signum为要捕获的信号,handler为捕获信号后要执行的函数名称。
Linux下的进程与线程(二)—— 信号的更多相关文章
- Linux下的进程与线程(一)—— 进程概览
进程是操作系统分配资源的基本单位.线程是操作系统进行运行和调度的基本单位. 进程之间可以切换,以便轮流占用CPU,实现并发.一般进程运行在用户模式下,只能执行指令集中的部分指令. 当进程进行上下文切换 ...
- Linux下查看进程和线程
在linux中查看线程数的三种方法 1.top -H 手册中说:-H : Threads toggle 加上这个选项启动top,top一行显示一个线程.否则,它一行显示一个进程. 2.ps xH 手册 ...
- linux下的进程,子进程,线程
1.相同点:(a)二者都具有ID,一组寄存器,状态,优先级以及所要遵循的调度策略.(b) 每个进程都有一个进程控制块,线程也拥有一个线程控制块.(c) 线程和子进程共享父进程中的资源:线程和子进程独立 ...
- Linux下c开发 之 线程通信(转)
Linux下c开发 之 线程通信(转) 1.Linux“线程” 进程与线程之间是有区别的,不过Linux内核只提供了轻量进程的支持,未实现线程模型.Linux是一种“多进程单线程”的操作系统.Linu ...
- linux下监控进程需掌握的四个命令
linux下监控进程需掌握的四个命令 在LInux系统下,最困难的工作之一就是跟踪正在系统中运行的程序,尤其是现在,图形桌面使用很多的程序,只是为了生成一个桌面环境,系统中运行了太多的进程,幸运的 ...
- linux下查看进程的状态 /proc/[pid]/status
查看进程的状态: 1.查看进程的pid,以java为例:ps -ef | grep java 2.查看进程状态:cat /proc/[pid]/status 关键字: linux [root@loca ...
- Linux下c开发 之 线程通信
Linux下c开发 之 线程通信 1.Linux“线程” 进程与线程之间是有区别的,不过Linux内核只提供了轻量进程的支持,未实现线程模型.Linux是一种“多进程单线程”的操作系统.Linux本身 ...
- Linux下的进程控制块(PCB)
本文转载自Linux下的进程控制块(PCB) 导语 进程在操作系统中都有一个户口,用于表示这个进程.这个户口操作系统被称为PCB(进程控制块),在linux中具体实现是 task_struct数据结构 ...
- Linux下java进程CPU占用率高分析方法
Linux下java进程CPU占用率高分析方法 在工作当中,肯定会遇到由代码所导致的高CPU耗用以及内存溢出的情况.这种情况发生时,我们怎么去找出原因并解决. 一般解决方法是通过top命令找出消耗资源 ...
随机推荐
- Linux查看非root运行的进程
Linux查看非root运行的进程 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ ps -U root -u root -N PID TTY TIME CMD ...
- DirectX:函数可以连接任意两个filter
函数可以连接任意两个filter HRESULT ConnectFilters( IBaseFilter *pSrc, IBaseFilter *pDest ) { IPin *pIn = 0; IP ...
- spring ioc(反转控制)
在Java中,我们建立一个对象的方式是new,有时需要单例,有时需要工厂,而spring中的bean的定义可以直接使用,如scope属性single产生单例对象,prototype产生新对象,bean ...
- CF AIM Tech Round 3 (Div. 2) D - Recover the String
模拟 首先可以求出 0 和 1 的个数 之后按照01 10 的个数贪心安排 细节太多 错的都要哭了 #include<bits/stdc++.h> using namespace std; ...
- Moo Volume POJ - 2231
Farmer John has received a noise complaint from his neighbor, Farmer Bob, stating that his cows are ...
- 异常-----freemarker.core.ParseException: Unexpected end of file reached
freemarker自定义标签 1.错误描述 freemarker.core.ParseException: Unexpected end of file reached. at freemarker ...
- Luogu3613 睡觉困难综合征
题面描述https://www.luogu.org/problemnew/show/3613 原题NOI2014起床困难综合症https://www.luogu.org/problemnew/show ...
- Cocos2d-x 集成openinstall(Android)
目的: 1. Cocos2d-x集成openinstall sdk? 有这么一个场景,甲给乙分享了链接,乙使用并下载APP,推荐者甲和乙的关系这个思路是怎样的? 你首先想到的也许会说,那当然就是给对方 ...
- 【Unity与23种设计模式】解释器模式(Interpreter)
GoF中定义: "定义一个程序设计语言所需要的语句,并提供解释来解析(执行)该语言." 传统上,执行程序代码通常通过两种方式 第一种:编译程序 第二种:解释器 常见的使用解释器的程 ...
- kubernete的证书总结
服务端保留公钥和私钥,客户端使用root CA认证服务端的公钥. kubernetes的证书类型主要分为3类: serving CA: 用于签署serving证书,该证书用于加密https通信.用于签 ...