嵌入式Linux:向进程发送信号
目录
1、kill()函数
2、killpg()函数
3、raise()函数
在 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(); // 获取当前进程组 IDprintf("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;
}