Linux信号机制探析--信号的产生
在Linux中,信号的产生方式主要有以下几种:
- 用户在终端通过键盘按键如
Ctrl+C
产生SIGINT
信号,Ctrl+\
产生SIGQUIT
信号等。 - 程序运行错误产生信号,如非法访问内存产生
SIGSEGV
信号。 - 系统状态变化产生信号,如定时器
SIGALRM
信号,在指定时间后触发。 - 硬件异常产生信号,如浮点异常产生
SIGFPE
信号。 - 调用
kill
函数可以发送信号给其他进程或进程组。 - 当执行某些高危操作如
exec
、fork
时,内核为了安全可靠需要发送SIGSTOP
信号暂停进程。
以下是一个简单的示例,演示如何使用kill
函数发送信号给其他进程:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
int main() {
pid_t pid = fork(); // 创建子进程
if (pid == -1) {
perror("fork failed");
exit(EXIT_FAILURE);
}
if (pid > 0) { // 父进程
printf("Parent process PID: %d\n", getpid());
sleep(1); // 等待子进程启动
if (kill(pid, SIGINT) == -1) { // 发送SIGINT信号给子进程
perror("kill failed");
exit(EXIT_FAILURE);
}
} else if (pid == 0) { // 子进程
printf("Child process PID: %d\n", getpid());
// 安装信号处理函数
struct sigaction sa;
sa.sa_handler = &handle_sigint;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
if (sigaction(SIGINT, &sa, NULL) == -1) {
perror("sigaction failed");
exit(EXIT_FAILURE);
}
while(1) { // 循环等待信号
pause(); // 暂停进程等待信号
}
}
return 0;
}
// 信号处理函数
void handle_sigint(int signum) {
printf("Caught SIGINT, Signal number: %d\n", signum);
}
在这个示例中,父进程使用fork
创建子进程后,父进程等待一秒钟,然后使用kill
函数向子进程发送SIGINT
信号。子进程安装了SIGINT
的信号处理函数handle_sigint
,当接收到SIGINT
信号时,会调用该函数输出信号名称。
评论已关闭