嵌入式Linux:向进程发送信号

2026-10-071

在 Linux 系统中,进程可以通过 kill() 系统调用向其他进程发送信号。除了 kill(),系统还提供了 killpg() 和 raise() 这两个函数,它们也可以用于发送信号。

1、kill()函数

kill() 函数用于向指定的进程或进程组中的每个进程发送信号。

函数原型如下:

#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);

参数说明

  • pid: 目标进程或进程组的 ID。
    • 如果 pid 为正数,则信号 sig 发送到 PID 指定的进程。
    • 如果 pid 为 0,则信号发送到当前进程组中的每个进程。
    • 如果 pid 为 -1,则信号发送到系统中所有可以发送信号的进程(但不包括进程 1,即 init)。
    • 如果 pid 小于 -1,则信号发送到 ID 为 -pid 的进程组中的每个进程。
  • sig: 要发送的信号。如果 sig 为 0,则仅进行错误检查,不实际发送信号。

返回值

  • 成功时返回 0。
  • 失败时返回 -1,并设置 errno。

在以下面的示例中,父进程创建了一个子进程,等待 5 秒后,使用 kill() 向子进程发送 SIGKILL 信号以终止它。

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
 
int main() {
    pid_t pid = fork();
    if (pid == 0) {
        // 子进程
        while (1) {
            printf("Child process running...\n");
            sleep(1);
        }
    } else {
        // 父进程
        sleep(5);
        printf("Sending SIGKILL to child process...\n");
        kill(pid, SIGKILL);  // 向子进程发送 SIGKILL 信号
        wait(NULL);  // 等待子进程结束
    }
    return 0;
}

2、killpg()函数

killpg() 函数用于向指定进程组中的每个进程发送信号。该函数并不在所有 Unix 系统中都可用,但在 Linux 中较为常见。

函数原型如下:

#include <signal.h>
int killpg(pid_t pgrp, int sig);

参数说明

  • pgrp: 目标进程组的 ID。通常使用负数来指定进程组的 ID。
  • sig: 要发送的信号。

返回值

  • 成功时返回 0。
  • 失败时返回 -1,并设置 errno。

在以下示例中,父进程和子进程在同一进程组中。父进程在等待 5 秒后,使用 killpg() 向进程组发送 SIGTERM 信号。

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
 
int main() {
    pid_t pgrp = getpgrp();  // 获取当前进程组 ID
    printf("Current process group ID: %d\n", pgrp);
 
    // 创建一个子进程
    pid_t pid = fork();
    if (pid == 0) {
        // 子进程
        while (1) {
            printf("Child process in group %d\n", getpgrp());
            sleep(1);
        }
    } else {
        // 父进程
        sleep(5);
        printf("Sending SIGTERM to process group...\n");
        killpg(pgrp, SIGTERM);  // 向进程组发送 SIGTERM 信号
        wait(NULL);  // 等待子进程结束
    }
    return 0;
}

3、raise()函数

raise() 函数用于向当前进程发送信号。

函数原型如下:

#include <signal.h>
int raise(int sig);

参数说明

  • sig: 要发送的信号。

返回值

  • 成功时返回 0。
  • 失败时返回非零值。

以下示例中,进程通过 raise() 向自身发送 SIGINT 信号,这会触发信号处理函数 signal_handler。

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
 
void signal_handler(int sig) {
    printf("Caught signal %d\n", sig);
}
 
int main() {
    signal(SIGINT, signal_handler);  // 设置信号处理函数
 
    printf("Raising SIGINT\n");
    raise(SIGINT);  // 向当前进程发送 SIGINT 信号
 
    return 0;
}

作者:不脱发的程序猿。来源:CSDN 原文(CC BY-SA 4.0)。

创作许可协议

本项目采用 CC BY-SA(署名-相同方式共享) 进行许可。

评论(0)
- 没有更多了 -