簡體   English   中英

SIGINT半阻塞可能嗎?

[英]is SIGINT semi blocking possible?

我試圖處理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;
    }
}

這是一個如何做我認為你想做的事情的例子。

#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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM