在C中签名后不睡觉

在C中签名后不睡觉,c,C,我有以下代码。当我在睡觉时收到SIGINT时,如何将控件恢复到cleanupCode()?我不想使用跳转或跳转。在处理程序内调用cleanupCode不是一个选项 sigHandler(int sig __atribute__((unused)) { loopFlag = 0; } void cleanupCode() { printf("Graceful exit \n"); } int main () { while(loopFlag)

我有以下代码。当我在睡觉时收到SIGINT时,如何将控件恢复到cleanupCode()?我不想使用跳转或跳转。在处理程序内调用cleanupCode不是一个选项

sigHandler(int sig __atribute__((unused)) {

    loopFlag = 0; 
}

void cleanupCode() 
{  printf("Graceful exit \n");

} 
int main ()  {    
     while(loopFlag)
       sleep(600);
     cleanupCode(); 
}

你必须把信号处理器设置在某个地方

#include <signal.h>
#include <unistd.h>

volatile int loopFlag = 1;

void sigHandler(int sig)
{
    loopFlag = 0;
}

void cleanupCode()
{
     printf("Graceful exit \n");
}

int main ()
{
    signal(SIGINT, sigHandler);

     while(loopFlag)
       sleep(600);

     cleanupCode();
}
#包括
#包括
volatile int loopFlag=1;
无效信号发生器(内部信号)
{
loopFlag=0;
}
void cleanupCode()
{
printf(“优雅退出”\n);
}
int main()
{
信号(SIGINT、sigHandler);
while(loopFlag)
睡眠(600);
cleanupCode();
}
这对我很有用:

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

typedef struct sigaction SigAction;
static volatile sig_atomic_t loopFlag = 1;

static void sigHandler(int signum __attribute__((unused)))
{
    loopFlag = 0; 
}

static void cleanupCode(void) 
{
    printf("Graceful exit\n");
} 

static void setSignals(void)
{
    SigAction action;
    sigfillset(&action.sa_mask);
    action.sa_handler = sigHandler;
    action.sa_flags = 0;
    sigaction(SIGINT, &action, 0);
}

int main(void)
{    
    setSignals();
    while (loopFlag)
        sleep(600);
    cleanupCode(); 
    return(0);
}
#包括
#包括
#包括
typedef结构sigaction sigaction;
静态易失性sig_原子环标志=1;
静态void signandler(int signum __属性_((未使用)))
{
loopFlag=0;
}
静态无效清除代码(void)
{
printf(“优雅退出”\n);
} 
静态无效设置信号(无效)
{
信号作用;
sigfillset(和action.sa_掩码);
action.sa_handler=sigHandler;
action.sa_标志=0;
sigation(SIGINT和action,0);
}
内部主(空)
{    
设置信号();
while(loopFlag)
睡眠(600);
cleanupCode();
返回(0);
}

注意,
loopFlag
应该声明为
volatile-sigamatic\u t
,以确保定义良好的行为(
sigamatic\u t
不那么重要,但如果没有
volatile
,编译器可能会优化
,同时将
循环变成一个无限循环)。在处理信号后,如何使控件清除代码()?谢谢,当中断发生时,将调用信号处理程序(
signandler()
),并将
loopFlag
设置为0。由于处理程序返回,代码返回到
sleep()
,但在中断时返回(而不是恢复其操作),因此while循环测试
loopFlag
,发现它未设置,并终止循环,执行清除代码。添加volatile关键字@Kitcha-见上面乔纳森的解释。