kill
和 signal
是用于进程间通信的信号处理相关函数。
kill
函数用于向指定的进程发送信号。其函数原型为:
int kill(pid_t pid, int sig);
-
pid
参数表示目标进程的进程号,如果pid
为正数,则将信号发送给进程号为pid
的进程;如果pid
为 0,则信号将发送给当前进程所在进程组的所有进程;如果pid
为 -1,则信号将发送给除系统进程和当前进程之外的所有进程;如果pid
小于 -1,则信号将发送给进程组号等于pid
的所有进程。 -
sig
参数表示要发送的信号类型,例如SIGTERM
表示终止进程。可以使用man 7 signal
命令查看 Linux 中支持的信号类型。
signal
函数用于设置信号处理函数。其函数原型为:
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
-
signum
参数是指定的信号代码。 -
handler
参数可以是自定义的信号处理函数,也可以是SIG_IGN
(表示忽略该信号)或SIG_DFL
(表示使用默认处理方式)。
示例代码中使用了 signal
函数来设置 SIGALRM
信号的处理函数为 my_alarm
,kill
函数用于发送 SIGALRM
信号。wait
函数用于等待子进程的退出,并获取子进程的退出状态。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
void my_alarm() {
printf("ding~~~\n");
}
int main() {
pid_t new_pid = fork();
if (new_pid == -1) {
perror("[err]");
}
if (new_pid > 0) {
printf("parent\n");
signal(SIGALRM, my_alarm);
wait(NULL);
exit(1);
}
if (new_pid == 0) {
printf("child\n");
int i;
for (i = 0; i < 5; i++)
sleep(1);
kill(getppid(), SIGALRM);
exit(0);
}
return 0;
}
这段代码的逻辑是创建一个子进程,在子进程中等待一段时间后,向父进程发送 SIGALRM
信号,父进程接收到该信号后执行 my_alarm
函数。