操作系统信号

版权声明: https://blog.csdn.net/KamRoseLee/article/details/84874690

SIGKILL

POSIX兼容的平台上,SIGKILL是发送给一个进程来导致它立即终止的信号SIGKILL符号常量头文件signal.h中定义。因为在不同平台上,信号数字可能变化,因此符号信号名被使用,然而在大量主要的系统上,SIGKILL是信号#9

SIGKILL被发送给一个程序时,它使程序立即终止。与SIGTERMSIGINT相比,这个信号不能被捕获或忽略,同时接收这个信号的进程在收到这个信号时不能执行任何清理。

僵尸进程不能被杀死,因为它们已经死亡,只等待它们的父进程回收它们。

处于阻塞状态的进程不会死亡,直到它们再次醒来。

init进程是特殊的:它不获得它不想处理的信号,因此它可以忽略SIGKILL

因为SIGKILL不给进程任何在终止时做清理操作的机会,在大部分系统关闭过程中,在采取SIGKILL之前,使用信号SIGTERM使进程终止的尝试先被作出。

即使SIGKILL被发送给它,一个正在不可中断睡眠的进程也可能不会终止(并且释放它的资源)。这是少数几个一个UNIX系统可能需要被重新启动来解决临时软件问题的例子中的一个。

SIGTREM

SIGTERM比较友好,进程能捕捉这个信号, 根据您的需要来关闭程序。在关闭程序之前,您可以结束打开的记录文件和完成正在做的任务。 在某些情况下,假如进程正在进行作业而且不能中断,那么进程可以忽略这个SIGTERM信号。
对于SIGKILL信号,进程是不能忽略的。 这是一个 '“我不管您在做什么,立刻停止”'的信号。 假如您发送SIGKILL信号给进程, FreeBSD就将进程停止在那里。

1.      SIGTERM

“kill pid” 会发送SIGTERM到进程pid.

This is the termination signal sent by killcommand by default.

扫描二维码关注公众号,回复: 4654012 查看本文章

2.      SIGINT

在终端中敲入interrupt keyDELETEctrl+c)会产生SIGINT信号。这个信号会被发送到进程(inforeground process group)。当我们想终止一个失控程序(runaway program,可以发送这个信号。用于结束前台进程。

3.      SIGKILL

“kill -9 pid” 会发送SIGKILL到进程pid.

另外此信号进程不能够捕获。用于强制结束进程pid.

SIGBUS

有多种可能导致SIGBUS信号:
1)
硬件故障,不用说,程序员最常碰上的肯定不是这种情形。

2) Linux平台上执行malloc(),如果没有足够的RAMLinux不是让malloc()失败返回, 而是向当前进程分发SIGBUS信号。

3) 某些架构上访问数据时有对齐的要求,比如只能从4字节边界上读取一个4字节的数据类型。IA-32架构没有硬性要求对齐,尽管未对齐的访问降低执行效率。另外一些架构,比如SPARCm68k,要求对齐访问,否则向当前进程分发SIGBUS信号。

SIGBUSSIGSEGV信号一样,可以正常捕获。SIGBUS的缺省行为是终止当前进程并产生core dump
SIGBUSSIGSEGV信号的一般区别如下:
1) SIGBUS(Bus error)
意味着指针所对应的地址是有效地址,但总线不能正常使用该指针。通常是未对齐的数据访问所致。
2) SIGSEGV(Segment fault)意味着指针所对应的地址是无效地址,没有物理内存对应该地址。

SIGSTOP

中止进程。无法处理和忽略。

SIGTSTPSIGSTOP的唯一区别:

将进程暂停是SIGTSTP的默认action,用户可以自定义一其handler,而将进程暂停是SIGSTOP的定死的action,用户不能修改。此外,二者没什么差别,都使用SIGCONT来讲进程重新激活。

猜你喜欢

转载自blog.csdn.net/KamRoseLee/article/details/84874690
今日推荐