
在 Linux 系统中,进程可以通过 kill() 系统调用向其他进程发送信号。除了 kill(),系统还提供了 killpg() 和 raise() 这两个函数,它们也可以用于发送信号。
kill()函数kill() 函数用于向指定的进程或进程组中的每个进程发送信号。
函数原型如下:
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);参数说明
pid 为正数,则信号 sig 发送到 PID 指定的进程。pid 为 0,则信号发送到当前进程组中的每个进程。pid 为 -1,则信号发送到系统中所有可以发送信号的进程(但不包括进程 1,即 init)。pid 小于 -1,则信号发送到 ID 为 -pid 的进程组中的每个进程。sig 为 0,则仅进行错误检查,不实际发送信号。返回值
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;
}killpg()函数killpg() 函数用于向指定进程组中的每个进程发送信号。该函数并不在所有 Unix 系统中都可用,但在 Linux 中较为常见。
函数原型如下:
#include <signal.h>
int killpg(pid_t pgrp, int sig);参数说明
返回值
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;
}raise()函数raise() 函数用于向当前进程发送信号。
函数原型如下:
#include <signal.h>
int raise(int sig);参数说明
返回值
以下示例中,进程通过 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)。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。