我正在尝试在 C 中引发和处理自定义信号。不幸的是,我只取得了部分成功。
我正在尝试遵循这个示例:https://www.techonthenet.com/c_language/standard_library_functions/signal_h/raise.php
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
sig_atomic_t signaled = 0;
#define TEST_SIGNAL_50 50
#define TEST_SIGNAL_51 51
#define TEST_SIGNAL_52 52
#define SIGUSR1 50
void sigHandler(int sig)
{
signaled = 1;
//Switch statement to handle all signals
switch(sig) {
case TEST_SIGNAL_50:
printf("Case 50 is Matched.\n");
break;
case TEST_SIGNAL_51:
printf("Case 51 is Matched.\n");
break;
case TEST_SIGNAL_52:
printf("Case 52 is Matched.\n");
break;
case SIGINT:
printf("SIGINT Case is Matched.\n");
break;
default: //Raised signal is not a match
printf("Raised signal %d is not a match.\n", sig);
break;
}
}
int main() {
printf("Hello, World! Test\n");
int raiseResult;
void (*prev_handler)(int);
//Register the signal handler
//prev_handler = signal(SIGINT, sigHandler); //This works
//prev_handler = signal(TEST_SIGNAL_50, sigHandler);
prev_handler = signal(SIGUSR1, sigHandler);
/* ... */
//raiseResult = raise(SIGINT); //This works
raiseResult = raise(SIGUSR1);
/* ... */
printf("raiseResult =%d.\n",raiseResult );
printf("signaled =%d.\n",signaled);
return 0;
}
最终目标是能够通过执行各种操作来处理不同的信号。但就目前而言,只需点击 switch 语句并获取相应的消息就可以了。
我知道
SIGINT
是一个实际信号。因此,当我加注 sigHandler()
时,SIGINT
就会起作用。但除此之外,我就不走运了。我从signal()
得到的返回值为负数;这告诉我我的失败与signal()
有关。
有人明白我做错了什么吗
signal()
?
正如一些用户所指出的,Windows 和我使用的 Windows 上的 C 编译器处理信号的方式不如 Linux 系统上的干净。将我的代码转移到基于 Linux 的系统(在我的例子中是 Ubuntu),它将按预期执行。