如何在 C 中发出/处理自定义信号?

问题描述 投票:0回答:1

我正在尝试在 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()

c signals signal-handling
1个回答
0
投票

正如一些用户所指出的,Windows 和我使用的 Windows 上的 C 编译器处理信号的方式不如 Linux 系统上的干净。将我的代码转移到基于 Linux 的系统(在我的例子中是 Ubuntu),它将按预期执行。

© www.soinside.com 2019 - 2024. All rights reserved.