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命令找出消耗资源 ...
随机推荐
- R语言实现对基因组SNV进行注释
很多时候,我们需要对取出的SNV进行注释,这个时候可能会在R上进行注释,通常注释文件都含有Chr(染色体).Start(开始位点).End(结束位点).Description(描述),而我们的SNV文 ...
- 《你不知道的 JavaScript 上卷》 学习笔记
第一部分: 作用域和闭包 一.作用域 1. 作用域:存储变量并且查找变量的规则 2. 源代码在执行之前(编译)会经历三个步骤: 分词/此法分析:将代码字符串分解成有意义的代码块(词法单元) 解析/语法 ...
- 改造 vue-cli 脚手架
改造 vue-cli 脚手架 注意,这里使用的 vue-cli 的版本为 2.8.2,不同版本的 vue-cli 可能会有些许不一样. 一.配置多页面 项目开发目录: 需要注意一点,每个页面的文件夹命 ...
- 【SPOJ】Distinct Substrings(后缀自动机)
[SPOJ]Distinct Substrings(后缀自动机) 题面 Vjudge 题意:求一个串的不同子串的数量 题解 对于这个串构建后缀自动机之后 我们知道每个串出现的次数就是\(right/e ...
- java volatile关键字解析
volatile是什么 volatile在java语言中是一个关键字,用于修饰变量.被volatile修饰的变量后,表示这个变量在不同线程中是共享,编译器与运行时都会注意到这个变量是共享的,因此不会对 ...
- webapi下的web请求
先看webapi提供的服务: [HttpPost] public ResultBaseModel SiteList(SiteModel param) { ResultBaseModel resultM ...
- 杭电oj-1000-A+B
Problem Description Calculate A + B. Input Each line will contain two integers A and B. Process to e ...
- Jersey+mybatis实现web项目第一篇
---恢复内容开始--- Jesery第一篇:实现Jesery前后台页面交互,Form表单提交,后台控制页面跳转 该项目中有实现的功能: Mybatis实现后台数据持久化 Jersey页面数据提交 后 ...
- 优化python程序的几点建议
1.在需要只读序列时,最好使用元组而非列表: 2.使用生成器yield,而不是创建大的元组和列表并在其上进行迭代处理: 3.尽量使用python内置的数据结构,而不实现自己的自定义结构: 4.从小字符 ...
- 员工选票系统-java
Yuangong.java package com.toupiao; public class Yuangong { private String name; private int piao; pu ...