Linux进程信号的捕捉处理方式

在Linux系统中,进程信号的捕捉和处理是进程管理的重要组成部分。信号是操作系统用来通知进程发生了某种事件的一种机制。以下是Linux进程信号捕捉和处理的几种常见方式:

信号处理函数

进程可以通过设置信号处理函数来捕捉和处理信号。信号处理函数是一个用户定义的函数,当信号发生时,操作系统会调用该函数。使用signalsigaction系统调用可以设置信号处理函数。

#include <signal.h>
#include <stdio.h>
#include <unistd.h>

void handle_signal(int signum) {
    printf("Received signal %d\n", signum);
}

int main() {
    signal(SIGINT, handle_signal);
    while (1) {
        printf("Waiting for signal...\n");
        sleep(1);
    }
    return 0;
}

忽略信号

进程可以选择忽略某些信号,使其不产生任何效果。使用signal系统调用并将处理函数设置为SIG_IGN可以忽略信号。

#include <signal.h>
#include <stdio.h>
#include <unistd.h>

int main() {
    signal(SIGINT, SIG_IGN);
    while (1) {
        printf("Ignoring SIGINT...\n");
        sleep(1);
    }
    return 0;
}

默认处理

如果进程没有为信号设置处理函数,信号将按照默认行为处理。默认行为可能是终止进程、忽略信号或产生核心转储文件。使用signal系统调用并将处理函数设置为SIG_DFL可以恢复信号的默认行为。

#include <signal.h>
#include <stdio.h>
#include <unistd.h>

int main() {
    signal(SIGINT, SIG_DFL);
    while (1) {
        printf("Default handling of SIGINT...\n");
        sleep(1);
    }
    return 0;
}

阻塞信号

进程可以暂时阻塞某些信号,使其在解除阻塞之前不会被处理。使用sigprocmask系统调用可以阻塞或解除阻塞信号。

#include <signal.h>
#include <stdio.h>
#include <unistd.h>

int main() {
    sigset_t set;
    sigemptyset(&set);
    sigaddset(&set, SIGINT);
    sigprocmask(SIG_BLOCK, &set, NULL);

    printf("SIGINT is blocked. Try sending SIGINT...\n");
    sleep(5);

    sigprocmask(SIG_UNBLOCK, &set, NULL);
    printf("SIGINT is unblocked.\n");

    while (1) {
        printf("Waiting for signal...\n");
        sleep(1);
    }
    return 0;
}

信号队列

Linux支持实时信号,这些信号可以被排队处理。使用sigqueue系统调用可以发送带有附加数据的信号。

#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

void handle_signal(int signum, siginfo_t *info, void *context) {
    printf("Received signal %d with value %d\n", signum, info->si_value.sival_int);
}

int main() {
    struct sigaction sa;
    sa.sa_sigaction = handle_signal;
    sa.sa_flags = SA_SIGINFO;
    sigaction(SIGRTMIN, &sa, NULL);

    union sigval value;
    value.sival_int = 123;
    sigqueue(getpid(), SIGRTMIN, value);

    while (1) {
        sleep(1);
    }
    return 0;
}

通过以上方式,Linux进程可以灵活地捕捉和处理信号,以适应不同的应用场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酷爱码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值