gpt4 book ai didi

c - sigprocmask 不恢复我的信号处理程序

转载 作者:太空宇宙 更新时间:2023-11-04 01:58:45 32 4
gpt4 key购买 nike

我的 C Unix 代码有问题。我将复制关键部分:因此,在第一个 sigprocmask 之后,我发送了一个信号,在 SIG_UNBLOCK 之后,前一个句柄(gestisciSignalDopoReg)不起作用,而是标准句柄管理我的信号,所以它只是终止了进程......怎么了?谢谢

struct sigaction gestoreSegnale;
sigset_t mask;
sigemptyset(&mask);
sigaddset(&mask,SIGTERM);
sigaddset(&mask,SIGINT);
sigaddset(&mask,SIGALRM);
sigaddset(&mask,SIGQUIT);
sigaddset(&mask,SIGHUP);
sigaddset(&mask,SIGSEGV);
sigaddset(&mask,SIGILL);
sigaddset(&mask,SIGPIPE);
void setSegnali(int segn,__sighandler_t handler){
gestoreSegnale.sa_handler=handler;
gestoreSegnale.sa_mask=mask;

sigaction(segn, &gestoreSegnale, NULL);
}
void eseguiSetSegnali(__sighandler_t handler){
setSegnali(SIGQUIT, handler);
setSegnali(SIGSEGV, handler);
setSegnali(SIGILL, handler);
setSegnali(SIGHUP, handler);
setSegnali(SIGTERM, handler);
setSegnali(SIGINT, handler);
}
void main(){
eseguiSetSegnali(gestisciSIGNALDopoReg);
sigprocmask(SIG_BLOCK,&mask,NULL);
.........other part of code.........
sigprocmask(SIG_UNBLOCK,&mask,NULL);
}

拜托!我需要帮助!

最佳答案

您没有初始化struct sigactionsa_flags 字段,因此它可能包含垃圾值。 SA_RESETHAND 位可能已设置,根据手册页,这会给您带来以下行为:

       SA_RESETHAND
Restore the signal action to the default state once the signal handler has been called. This flag is
only meaningful when establishing a signal handler. SA_ONESHOT is an obsolete, non-standard synonym
for this flag.

如果您的信号处理程序运行过一次,这将导致它被清除并返回到默认值,因此您可能只需要将标志清零,例如:

void setSegnali(int segn,__sighandler_t handler){
gestoreSegnale.sa_handler=handler;
gestoreSegnale.sa_mask=mask;
/* Make sure to clear flags */
gestoreSegnale.sa_flags=0;

sigaction(segn, &gestoreSegnale, NULL);
}

无论如何,下面的小例子是可行的:

#include <signal.h>
#include <stdio.h>

void handler(int sig) {
printf("HUP %d\n", sig);
}

void main(){
struct sigaction act;

/* Block SIGHUP while the signal handler is running */
sigemptyset(&act.sa_mask);
sigaddset(&act.sa_mask,SIGHUP);

/* Define handler for signal */
act.sa_handler = handler;

/* Clear flags */
act.sa_flags = 0;
act.sa_restorer = NULL;

/* Install handler for SIGHUP */
sigaction(SIGHUP, &act, NULL);

/* Set mask to block SIGHUP */
sigset_t mask;
sigemptyset(&mask);
sigaddset(&mask, SIGHUP);

/* Block SIGHUP */
printf("Blocking SIGHUP\n");
sigprocmask(SIG_BLOCK,&mask,NULL);
printf("Sleeping\n");
sleep(60);
/* Unblock SIGHUP */
printf("Unblocking SIGHUP\n");
sigprocmask(SIG_UNBLOCK,&mask,NULL);
printf("Sleeping again\n");
while(1)
sleep(60);
}

如果运行,您会看到预期的结果:

$ ./sigtest 
Blocking SIGHUP
Sleeping <-- SIGHUP sent from another terminal here but blocked
Unblocking SIGHUP
HUP 1 <-- Signal sent earlier now delivered and handled
Sleeping again
HUP 1 <-- Further signals sent are all handled
HUP 1
HUP 1
^C

关于c - sigprocmask 不恢复我的信号处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30018343/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com