Linux信号机制探析--信号的产生
    		       		warning:
    		            这篇文章距离上次修改已过429天,其中的内容可能已经有所变动。
    		        
        		                
                在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信号时,会调用该函数输出信号名称。
评论已关闭