【问题标题】:My signal handler sample is not working我的信号处理程序示例不工作
【发布时间】:2014-01-20 16:31:47
【问题描述】:

1.我写了一段示例代码,它会捕获 SIGALRM 信号退出主进程。

#include<stdio.h>
#include<stdlib.h>
#include<signal.h>
#include<sys/signal.h>

static int sig_flag=0;
static void mysignal(int sig)
{
        sig_flag=1;
}

void installsignal(int sig,void( *signalhandler)(int))
{
    struct sigaction action={0};
    action.sa_handler=signalhandler;
    action.sa_flags=0;
        sigemptyset(&action.sa_mask);
        if(sigaction(sig,&action,NULL)<0)
        {
                printf("can not catch signal signum:%d\n",sig);
        }
}
main()
{
        installsignal(SIGALRM,mysignal);
        if(sig_flag==1)
        {
                printf("\n Signal has been caought\n");
                exit(0);
        }
        while(1)
        {
                printf("\nHello world\n");
                sleep(1);
        }
        exit(0);
}

2.当我按如下所示更改我的程序时,它的工作原理:-

#include<stdio.h>
#include<stdlib.h>
#include<signal.h>
#include<sys/signal.h>

static int sig_flag=0;
static void mysignal(int sig)
{
 sig_flag=1;
}

void installsignal(int sig,void( *signalhandler)(int))
{
    struct sigaction action={0};
    action.sa_handler=signalhandler;
    action.sa_flags=0;
    sigemptyset(&action.sa_mask);
    if(sigaction(sig,&action,NULL)<0)
    {
     printf("can not catch signal signum:%d\n",sig);
    }
}
main()
{
    installsignal(SIGALRM,mysignal);
    while(1)
    {
     printf("\nHello world\n");
     if(sig_flag==1)
     {
      printf("\n Signal has been caought\n");
      exit(0);
     }
     sleep(1);
    }
        exit(0);
}

为什么第一个示例代码不起作用

【问题讨论】:

  • 你有没有让它工作?如果是这样,请接受答案。这样做会在未来帮助其他人

标签: c linux


【解决方案1】:

你弄错了控制回路。你从不要求内部的标志,所以你希望你如何注意到信号已被捕获。

除了 Basile 是正确的之外,仅使用 sig_atomic_t 与信号处理程序进行通信。

【讨论】:

    【解决方案2】:

    你应该定义

     static volatile sig_atomic_t sig_flag=0;
    

    阅读volatile variablessig_atomic_t并仔细阅读signal(7)

    当然你需要在你的循环中测试sig_flag inside 或者使用pause(2)sigsuspend(2)。也许您想要使用poll(2)event loop。阅读Advanced Linux Programmingtime(7),了解Linux 特定的signalfd(2)timerfd_create(2)....

    【讨论】:

    • +1,但这不是导致不良行为的原因。
    猜你喜欢
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 2023-01-20
    • 1970-01-01
    • 2021-12-29
    • 2010-10-29
    相关资源
    最近更新 更多