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命令找出消耗资源 ...
随机推荐
- C# 通过smtp服务器进行邮件发送 MailHelper
C# 通过smtp服务器进行邮件发送 MailHelper.cs using System; using System.Data; using System.Configuration; using ...
- java实现在线支付
国内电子商务系统实现的基本流程如下: 客户在系统内下订单 -> 系统根据订单生成支付宝接口url -> 客户通过url使用支付宝(网上银行)付款 -> 支付宝将客户的付款完成信息发送 ...
- H5 EventSource 实现web页面推送功能demo
/** * H5 EventSource 实现web页面推送功能demo */ var serverData,statusDiv; var SERVER_URL = "index.php&q ...
- 【Luogu3457】POW-The Flood(并查集)
[Luogu3457]POW-The Flood(并查集) 题面 洛谷 题解 我们知道,如果一个点和一个海拔不高于它的点相连 那么连在那个点是更优的,所以考虑按照每个点的海拔排序 既然按照海拔排序,相 ...
- 【BZOJ2301】【HAOI2011】Problem B(莫比乌斯反演)
[BZOJ2301][HAOI2011]Problem B(莫比乌斯反演) 题面 Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y ...
- 【Luogu3919】可持久化数组(主席树)
题面戳我 题解 放一个板子在这里 用主席树维护一下每个版本就可以啦... #include<iostream> #include<cstdio> #include<cst ...
- Java并发编程实战(chapter_1)(原子性、可见性)
混混噩噩看了很多多线程的书籍,一直认为自己还不够资格去阅读这本书.有种要高登大堂的感觉,被各种网络上.朋友.同事一顿外加一顿的宣传与传颂,多多少少再自我内心中产生了一种敬畏感.2月28好开始看了之后, ...
- [.Net Core] 简单使用 Mvc 内置的 Ioc(续)
简单使用 Mvc 内置的 Ioc(续) 本文基于 .NET Core 2.0. 上一章<[.Net Core] 简单使用 Mvc 内置的 Ioc>已经对日常 Mvc 中的 Ioc 的简单用 ...
- grub4dos和winsetupfromusb1.4
其实grub4dos也是一个多系统启动盘制作软件,GRUB4DOS 最大的成功之处就是既学习了windows的方便易用,又引入linux的强大功能.http://baike.baidu.com/lin ...
- Selenium和Firefox兼容问题
运行时遇到错误: org.openqa.selenium.firefox.NotConnectedException: Unable to connect to host 127.0.0.1 on p ...