Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sigaction和SIGALRM_C - Fatal编程技术网

Sigaction和SIGALRM

Sigaction和SIGALRM,c,C,嗨,我想学习更多关于信号的知识,我写了一个简单的代码,可以打印“再见”所有报警信号。我正在使用sigaction设置此项。然而,在我的错误检查中,我一直返回NULL。有人能告诉我我做错了什么吗。提前谢谢 #include <stdio.h> #include <stdlib.h> #include <sys/wait.h> #include <sys/time.h> /* for setitimer */

嗨,我想学习更多关于信号的知识,我写了一个简单的代码,可以打印“再见”所有报警信号。我正在使用sigaction设置此项。然而,在我的错误检查中,我一直返回NULL。有人能告诉我我做错了什么吗。提前谢谢

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/wait.h>
    #include <sys/time.h>       /* for setitimer */
    #include <unistd.h>     /* for pause */
    #include <signal.h>     /* for signal */
    #define INTERVAL 500        /* number of milliseconds to go off */

    /* function prototype */
    void DoStuff();

    int main(int argc, char *argv[]) {
      struct itimerval it_val;  /* for setting itimer */
      struct sigaction sa;
      sa.sa_handler = &DoStuff;

      /* Upon SIGALRM, call DoStuff().
      * Set interval timer.  We want frequency in ms, 
      * but the setitimer call needs seconds and useconds. */
      if (sigaction(SIGALRM,&sa,NULL) < 0) { /*set the signal to be enabled if this action occurs*/
        perror("Unable to catch SIGALRM");
        exit(1);
      }

      it_val.it_interval = it_val.it_value;
      it_val.it_value.tv_sec =     INTERVAL/1000;
      it_val.it_value.tv_usec =    (INTERVAL*1000) % 1000000;   
      it_val.it_interval = it_val.it_value;
      if (setitimer(ITIMER_REAL, &it_val, NULL) == -1) { /*set the timer to send the alarm command*/
        perror("error calling setitimer()");
        exit(1);
      }
    while(1)
    {
          pause();
    }


    }

    void DoStuff() {
      printf("bye\n");
    }
#包括
#包括
#包括
#包括/*用于setitimer*/
#包含/*用于暂停*/
#包括/*用于信号*/
#定义间隔500/*要关闭的毫秒数*/
/*功能原型*/
void DoStuff();
int main(int argc,char*argv[]){
struct itimerval it_val;/*用于设置itimer*/
struct-sigaction-sa;
sa.sa_handler=&DoStuff;
/*在SIGALRM上,调用DoStuff()。
*设置间隔计时器。我们需要毫秒的频率,
*但是setitimer调用需要秒和秒*/
如果(sigaAction(SIGALRM,&sa,NULL)<0){/*如果发生此操作,请将信号设置为启用*/
佩罗尔(“抓不到西格尔姆”);
出口(1);
}
it_val.it_interval=it_val.it_值;
it_val.it_value.tv_sec=间隔/1000;
it_val.it_value.tv_usec=(间隔*1000)%1000000;
it_val.it_interval=it_val.it_值;
如果(setitimer(ITIMER_REAL,&it_val,NULL)=-1){/*设置计时器以发送报警命令*/
perror(“调用setitimer()时出错”);
出口(1);
}
而(1)
{
暂停();
}
}
void DoStuff(){
printf(“再见”);
}

sigaction不能返回null,因为它返回一个整数。我假设它正在返回-1。您没有正确初始化sigaction结构。它有许多字段,但您允许它们未定义。请修复结构定义,然后重试。见:


printf()不是信号处理程序安全的。发布的代码对我来说很好。你看到了什么错误?sigaction总是返回NULL@ThingyWotsit:在这种情况下是安全的,因为如果main成功启动信号处理程序和计时器,它从不调用任何stdio例程(直接或间接)。但这是不寻常的。@SamuelMagaña:sigaction成功时返回0,错误时返回-1。NULL不进入它。