Linux:进程信号(一.认识信号、信号的产生及深层理解、Term与Core)
在Linux系统中,信号是一种进程间通信的方式,用以通知接收进程某个事件已经发生。
一、认识信号:
信号是软件中断,是一种异步事件处理机制。每个信号都有一个名字,如SIGINT、SIGTERM等,这些名字都以SIG开头。
二、信号的产生:
- 键盘产生信号:如用户按下
Ctrl+C
,产生SIGINT
信号。 - 系统调用产生信号:如进程执行
kill()
系统调用,可以发送信号给其他进程。 - 硬件异常产生信号:如除以0、无效内存访问等,产生如
SIGSEGV
的信号。 - 系统状态变化产生信号:如定时器信号
SIGALRM
,通过alarm()
或setitimer()
设置定时器时间。
三、深层次理解信号:
信号的处理方式:
- 忽略信号:对信号不做任何处理,但是有两个信号不能忽略:SIGKILL和SIGSTOP。
- 捕获信号并处理:定义信号处理函数,当信号发生时,执行相应的处理函数。
- 执行默认动作:对于大部分信号,系统默认动作是终止进程。
信号的阻塞:
- 信号阻塞是指,在一段时间内,阻止信号的传递。
- 使用
sigprocmask()
函数可以阻塞信号,使用sigpending()
可以查看当前被阻塞的信号。
实时发送信号:
- 使用
sigqueue()
函数,可以向一个进程发送信号,并附带额外的信息。
- 使用
四、Term与Core:
这两个信号通常用于请求进程正常退出或者core dump。
SIGTERM
:是一个结束信号,它默认的动作是终止进程。SIGCORE
:是当进程因为某种异常条件(如内存访问错误)导致进程非正常退出时,生成的core dump后进程被发送的信号。
在实际编程中,可以通过signal()或sigaction()函数来设置信号处理函数,以对信号进行处理。
示例代码:
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
void handler(int sig) {
printf("Caught signal %d\n", sig);
// 处理信号...
}
int main() {
struct sigaction sa;
sa.sa_handler = &handler;
sa.sa_flags = 0;
sigemptyset(&sa.sa_mask);
sigaction(SIGINT, &sa, NULL); // 注册信号处理函数
while(1) {
sleep(1);
}
return 0;
}
在这个例子中,程序会注册SIGINT
(Ctrl+C 产生的信号)的处理函数handler
。当用户按下Ctrl+C时,系统会发送SIGINT
信号给该进程,进程会调用handler
函数来处理这个信号。
评论已关闭