在Unix-like操作系统中,进程间通信(IPC)的一种方式是通过信号(signals)。信号是一种软件中断,用于通知进程某个事件已经发生。每个信号都有一个与之关联的默认行为,但进程可以选择捕获信号并执行自定义的处理函数。
信号:是一种异步通知机制,用于告知进程某个事件已经发生。信号可以由内核产生(如除以零错误),也可以由其他进程产生(如通过kill
命令)。
自定义信号:除了系统预定义的信号外,进程可以发送用户自定义的信号(通常是实时信号,范围在SIGRTMIN到SIGRTMAX之间)。
以下是一个简单的C语言示例,展示如何向当前进程发送自定义信号,并捕获处理该信号。
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
// 自定义信号处理函数
void handle_signal(int sig) {
printf("Received custom signal %d\n", sig);
}
int main() {
// 注册自定义信号处理函数
if (signal(SIGUSR1, handle_signal) == SIG_ERR) {
perror("signal");
exit(EXIT_FAILURE);
}
printf("Process is running. Send SIGUSR1 to trigger the custom signal handler.\n");
// 主循环,等待信号
while (1) {
pause(); // 挂起进程,等待信号
}
return 0;
}
要向上述进程发送自定义信号(例如SIGUSR1),可以使用kill
命令:
kill -SIGUSR1 <pid>
其中<pid>
是目标进程的进程ID。
问题:信号处理函数没有被调用。
原因:
解决方法:
signal
或sigaction
正确注册了信号处理函数。sigaction
代替signal
可以提供更可靠的信号处理机制。通过上述方法,可以有效地向进程发送自定义信号,并确保信号处理函数能够正确响应。
领取专属 10元无门槛券
手把手带您无忧上云