首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何多次发送SIGINT信号

如何多次发送SIGINT信号
EN

Stack Overflow用户
提问于 2015-07-15 17:50:35
回答 1查看 2.2K关注 0票数 0

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

代码语言:javascript
复制
#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;
}

以下代码的输出是

代码语言:javascript
复制
Raising the interactive attention signal.
Interactive attention signal caught.
Raising the interactive attention signal.

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

代码语言:javascript
复制
#include <signal.h>
#include <stdio.h>

void signal_handler(int signal)
{
    printf("Received signal %d\n", signal);
}

int main(void)
{
    // Install a signal handler.
    signal(SIGINT, signal_handler);

    printf("Sending signal %d\n", SIGINT);
    raise(SIGINT);
    raise(SIGINT);
    raise(SIGINT);
    printf("Exit main()\n");
}

输出是

代码语言:javascript
复制
sending signal 2
Received signal 2

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-15 18:03:21

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

代码语言:javascript
复制
void signal_handler(int signal)
{
    signal(SIGINT, signal_handler);
    printf("Received signal %d\n", signal);
}

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31437568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档