关于Linux信号的总结
标准信号与实时信号
0-31 这 32 个信号称为标准信号。
从 32 到 63 之间的 32 个信号称为实时信号。
可以通过 man 7
signal 查看对“标准信号”和“实时信号”详细的描述。
信号排队
每个进程拥有一个信号等待队列。在 task_struct 中有一个 struct sigpending pending 域,
就是进程的信号等待队列。
当向一个进程发送信号时,信号会先被送入进程的信号等待队列,然后等到进程被调度到去处理信号的时候,会从信号
等待队列中依次取出信号进行处理。
标准信号不能排队,而实时信号可以排队:
假设进程屏蔽了一个标准信号,当给它连续发送多个相同
的标准信号,则只有第一个被放入进程的信号等待队列中,后续的都被丢弃。
假设进程屏蔽了一个实时信号,当给它连续发送多个相同的实时信号,则所有
的信号都被放入进程的信号接收队列中。
实时信号是在 POSIX.4 实时信号扩展中定义的。
信号屏蔽
进程可以屏蔽它不想接收的信号。
在 task_struct 中有一个 block 域,指定了进程要屏蔽的信号集合。
屏蔽信号
带来的影响:
1、
当向一个进程投递信号时,如果发现进程屏蔽了此信号,则即使此进程处于睡眠状态,也不唤醒它。(否则睡眠的进程会被唤醒)。
2、
当进程开始处理它的信号等待队列的时候,对于被屏蔽的信号,不做处理。所以这些信号会一直待在等待队列中,直到进程解开对相应信号的屏蔽,才能被处理。(按照以上理解,也就是虽说某些信号被屏蔽,但是这个信号会被保存在pending里,只是在进程从内核返回处理信号时不处理被阻塞(屏蔽)的信号,直到该信号被解除屏蔽)
但
是 KILL 和 TERM 这两种信号是不能屏蔽的。
发送信号的处理过程
用户空间可以通过 kill() 或 sigqueue() 两个系统调用来向一个进程发送信号。
内核空间的入口是 sys_kill():
sys_kill()
==> kill_something_info() ==> kill_proc_info() ==>
send_sig_info() ==> deliver_signal() ==> send_signal()
1、 首先,根据 PID 找到对应的目标进程。 这是通过
find_task_by_pid() 实现的。
2、 如果目标进程对信号的处理行为是“忽略”,则无需投递
3、
相关文档:
什么是例行性命令?
Linux 系统的例行性命令有哪些?
仅执行一次的工作排程: at
循环执行的例行性命令:
crontab
系统的
crontab 设定: /etc/crontab
安全的防护: /var/log/cron 记录文件
本章习题练习
什么是例行性命令?
每个人或多或少都有一些约会或者是工作,有的工作是例行性的,例如每年一次� ......
如何开启关闭linux防火墙
重启后生效
开启:chkconfig iptables on
关闭:chkconfig iptables off
即时生效,重启后失效
开启:service iptables start
关闭:service iptables stop
或
关闭: /etc/rc.d/init.d/iptables stop
启动: /etc/rc.d/init.d/ip ......
在学习APUE时学习信号编程,很多地方不是理解,便查阅了网络上的相关资料,最常见的一句话就是“信号是中断机制的一种模拟”,既然提到了中断,那就首先了解了一下中断的具体分类以及实现,最后再找出中断和信号的区别。
LINUX中断机制与信号
中断和异常
l
中断(也称硬件中断)
定义
:� ......
二、信 号 机 制
上 一节中介绍了信号的基本概念,在这一节中,我们将介绍内核如何实现信号机制。即内核如何向一个进程发送信号、进程如何接收一个信号、进程怎样控制自己对信 号的反应、内核在什么时机处理和怎样处理进程收到的信号。还要介绍一下setjmp和longjmp在信号中起到的作用。
1、内核对信号的� ......
前面两节已经介绍了有关信号的大部分知
识。这一节我们来了解一下这些系统调用。其中,系统调用signal是进程用来设定某个信号的处理方法,系统调用kill是用来发送信号给指定进程的。这
两个调用可以形成信号的基本操作。后两个调用pause和alarm是通过信号实现的进程暂停和定时器,调用alarm是通过信号通知进程定时器� ......