如何多次发送SIGINT信号

how to send SIGINT signal multiple times

本文关键字:SIGINT 信号 何多次      更新时间:2023-10-16

我正试图从其他线程向主线程发送SIGINT信号。主线程已经为该信号分配了一个处理程序。当我发送第一个信号时,它被处理程序捕获。但我想连续发送信号。但是在处理第一个信号之后,程序终止。我放了一个while循环。所以我期望的是它应该继续发送这些信号。下面是我的代码

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
static void catch_function(int signo) {
    puts("Interactive attention signal caught.");
}
DWORD WINAPI MyThreadFunction( LPVOID lpParam ) 
{
    while(1)
    {
        Sleep(50);
        puts("Raising the interactive attention signal.");
        if (raise(SIGINT) != 0) 
        {
            fputs("Error raising the signal.n", stderr);
            return EXIT_FAILURE;
        }
    }
return 0;
}

int main(void) 
{
     if (signal(SIGINT, catch_function) == SIG_ERR) {
    fputs("An error occurred while setting a signal handler.n", stderr);
    return EXIT_FAILURE;
    }
    HANDLE thread;
    DWORD  threadId;
    thread = CreateThread(NULL, 0, &MyThreadFunction, NULL, 0, &threadId);
    if(!thread)
    {
        printf("CreateThread() failed");
    }
    while(1)
    {
        Sleep(50);
    }
    puts("Exiting.");
    return 0;
}

下面代码的输出是

Raising the interactive attention signal.
Interactive attention signal caught.
Raising the interactive attention signal.

我也试过用一个简单的例子。这里我发送了3次信号,但只有第一次信号被捕获。在那之后,这个项目终止了。下面是代码

#include <signal.h>
#include <stdio.h>
void signal_handler(int signal)
{
    printf("Received signal %dn", signal);
}
int main(void)
{
    // Install a signal handler.
    signal(SIGINT, signal_handler);
    printf("Sending signal %dn", SIGINT);
    raise(SIGINT);
    raise(SIGINT);
    raise(SIGINT);
    printf("Exit main()n");
}

输出

sending signal 2
Received signal 2

我想知道如何继续从一个线程向另一个线程发送一些信号?我希望我的一个线程将发送SIGINT信号,main将捕获它们并相应地执行一些操作。

通常在第一个信号之后,信号处理程序被重置为SIG_DFL (Unix V信号),并且SIG_INT的默认行为退出程序。这就是你观察到的。所以它需要重新安装处理程序。在处理程序中重新安装它:

void signal_handler(int signal)
{
    signal(SIGINT, signal_handler);
    printf("Received signal %dn", signal);
}

一个更好的方法是使用sigaction代替,因为它没有这种行为。