SIGINT 半阻塞可能吗?

Posted

技术标签:

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

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

我试过了:

    基本信号处理(如下图)

    sigaction 功能

    非本地信号处理

    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;
    

【问题讨论】:

【参考方案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 标准中实现定义的。

以上是关于SIGINT 半阻塞可能吗?的主要内容,如果未能解决你的问题,请参考以下文章

linux信号 SIGINT SIGTERM SIGKILL

Linux Linux程序练习十三(信号阻塞,捕获)

MySQL 基础知识梳理学习----半同步复制

python的sched模块可​​以在任务执行期间不阻塞地运行异步任务吗?

非阻塞的Win32系统调用(例如ReleaseMutex)会导致线程阻塞并允许较低优先级的线程运行吗?

java套接字/输出流写入:它们阻塞吗?