[英]is SIGINT semi blocking possible?
我試圖處理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;
}
}
這是一個如何做我認為你想做的事情的例子。
#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.