【问题标题】:is SIGINT semi blocking possible?SIGINT 半阻塞可能吗?
【发布时间】:2014-04-02 23:10:19
【问题描述】:

我正在尝试处理 SIGINT。 SIGINT 在我的程序中的主要目的是取消当前搜索功能并打印当前可用的结果。但是每当我试图捕捉一个 SIGINT 信号时,它只会关闭我的程序。 (搜了这么多,请不要说我搜的还不够)

我试过了:

  1. 基本信号处理(如下图)

  2. sigaction 功能

  3. 非本地信号处理

  4. sigprocmask(当我阻塞信号时,procmask 出现问题,我无法捕捉到它,但我需要捕捉并在屏幕上打印)

毕竟我已经用完了搜索关键字来找到解决方案。任何的想法 ? (搜索关键字或部分代码或逻辑方式来做到这一点^^)

注意:此文本可能有语法错误。如有错误请见谅。

#ifdef DEBUG
#define DPRINT(file ,message ,arg)      fprintf(file ,message ,arg);
#define NDPRINT(file ,message)          fprintf(file ,message);
#endif

static volatile sig_atomic_t isSignalCaught = 0;
void SIGHandler(int signo);

int main(int argc, char** argv)
{
    file_t *files,*nextP;

    signal(SIGINT, SIGHandler);

    files = findFiles("/");

    while (files != NULL) {
        DPRINT(stderr, "%s\n", files->fileName.string);
        nextP = files->pNext;
        free(files->fileName.string);
        free(files);
        files = nextP;
    }

    return(0);
}

void SIGHandler(int signo)
{
    file_t *nextP;
    if (signo == SIGINT) {
        isSignalCaught = 1;
    }
}

【问题讨论】:

    标签: c signals sigint


    【解决方案1】:

    这是一个如何做我认为你想做的事的例子。

    #include <stdio.h>
    #include <stdlib.h>
    #include <signal.h>
    #include <ctype.h>
    
    typedef void(*  sig_func_t  )(int);
    
    volatile sig_atomic_t keep_looping = 1;
    
    void sig_handler(int sig_number) {
        switch (sig_number) {
        case SIGINT:
            keep_looping = 0;
            break;
        }
    }
    
    int should_continue(void) {
        char line[256];
        while (1) {
            printf("Continue? (y/n) ");
            fgets(line, sizeof line, stdin);
            if (tolower(line[0]) == 'y') {
                keep_looping = 1;
                signal(SIGINT, sig_handler);
                return 1;
            }
            if (tolower(line[0]) == 'n')
                break;
        }
        return 0;
    }
    
    int main (void) {
        sig_func_t sig_func;
    
        sig_func = signal(SIGINT, sig_handler);
        if (sig_func == SIG_ERR) {
            perror("signal");
            exit(EXIT_FAILURE);
        }
    
        unsigned n = 0;
        printf("Starting...\n");
    
        while (1) {
            while (keep_looping)
                n++;
    
            printf("Current value: n=%u\n", n);
    
            if (!should_continue())
                break;
        }
    
        signal(SIGINT, sig_func);
    
        return EXIT_SUCCESS;
    }
    

    【讨论】:

    • 那么我关于重新注册我的 SIGHandler 的问题对吗?但是一个萌问题为什么我不能在我的处理程序中重新注册我的处理程序?
    • @YakupTürkan,我不知道为什么我没有将重新注册放在处理程序中,只是它让你有机会不重新注册。
    • sigaction() 的众多优点之一是您不必在信号处理程序中重新注册信号处理程序。 signal() 在这方面的行为是在 C 标准中实现定义的。
    猜你喜欢
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 2011-09-22
    • 1970-01-01
    • 2011-03-02
    • 2012-01-20
    相关资源
    最近更新 更多