通过信号SIGQUIT唤醒睡眠守护程序

时间:2019-04-12 09:44:47

标签: c linux signals

我用C(Linux)编写的守护程序遇到问题。 我的程序首先处于睡眠过程,然后在收到信号后应唤醒。 我应该在myhandler中写些什么?

#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <syslog.h>
#include <string.h>
#include <signal.h>

void myhandler(int signal)
{


}
int main(void) {
signal(SIGQUIT,myhandler);

        /* Our process ID and Session ID */
        pid_t pid, sid;

        /* Fork off the parent process */
        pid = fork();
        if (pid < 0) {
                exit(EXIT_FAILURE);
        }
        /* If we got a good PID, then
           we can exit the parent process. */
        if (pid > 0) {
                exit(EXIT_SUCCESS);
        }

        /* Change the file mode mask */
        umask(0);

        /* Open any logs here */        

        /* Create a new SID for the child process */
        sid = setsid();
        if (sid < 0) {
                /* Log the failure */
                exit(EXIT_FAILURE);
        }



        /* Change the current working directory */
        if ((chdir("/")) < 0) {
                /* Log the failure */
                exit(EXIT_FAILURE);
        }



        /* Daemon-specific initialization goes here */

        /* The Big Loop */
        while (1) {
           /* Do some task here ... */

           sleep(30); /* wait 30 seconds */
        }
   exit(EXIT_SUCCESS);
}

1 个答案:

答案 0 :(得分:0)

  

我应该在myhandler中写什么?

空信号处理程序功能很好。它会中断sleep。参见man signal(7)

  

sleep函数也永远不会在被处理程序中断的情况下重新启动,但会返回成功:睡眠剩余秒数。

但是,我建议不要禁用SIGQUIT的默认操作,该操作将终止进程和转储核心。 SIGINT可能是更好的选择。

例如:

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

static void signal_handler(int) {}

int main() {
    signal(SIGINT, signal_handler);
    if(sleep(60))
        printf("signal received\n");
}

输出:

$ ./test
^Csignal received