我正在try 用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是一个实际的信号.因此,当我筹集SIGINT的时候,sigHandler()就会起作用.但除此之外,我就不走运了.我从signal()得到的返回值是负值;这告诉我我的失败与signal()有关.

有没有人知道我用signal()做错了什么?

推荐答案

正如一些用户指出的那样,Windows和我使用的Windows上的C编译器没有在Linux系统上处理信号那么干净.把我的代码移植到基于Linux的系统上(在我的例子中是Ubuntu),它就会像预期的那样运行.

C++相关问答推荐

为什么在传输 Big Data 时共享内存段的运行时间比管道更长?

gcc已编译的可执行文件TSB是否同时暗示最低有效字节和最低有效位?

Mbed TLS:OAEP的就地en—/decryption似乎不起作用'

ATmega328P USART发送字符重复打印

如何在C中只使用一个带双方括号([i][j])访问语法的malloc来分配动态大小的2d数组?

如何判断宏参数是否为C语言中的整型文字

无效指针值在函数调用之间莫名其妙地改变

LibpCap禁用监视器模式(C、MacOS)

LONG_DOUBLE_T是否存在(标准C:C23)

CSAPP微型shell 实验室:卡在sigprocmask

为什么数组的最后一个元素丢失了?

在函数外部使用内联ASM时无法指定操作数

如何在不更改格式说明符的情况下同时支持双精度和长双精度?

挥发性语义的形式化理解

STM32:代码的执行似乎取决于它在闪存中的位置

为什么 Linux 共享库 .so 在内存中可能比在磁盘上大?

多行表达式:C 编译器如何处理换行符?

如何确定 C 程序中的可用堆内存

strlen 可以是[[未排序]]吗?

char* 上的 free() 被 valgrind 识别为无效