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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过信号SIGQUIT唤醒睡眠守护进程相关的知识,希望对你有一定的参考价值。

我的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);
}
答案

我应该在myhandler写什么?

空信号处理函数很好。它打断了sleep。见man signal(7)

如果被处理程序中断,sleep函数也永远不会重新启动,但会给出成功返回:剩余的休眠秒数。

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

Ef。:

#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
");
}

输出:

$ ./test
^Csignal received

以上是关于通过信号SIGQUIT唤醒睡眠守护进程的主要内容,如果未能解决你的问题,请参考以下文章

调用睡眠的程序不会在信号上唤醒

Golang信号处理和优雅退出守护进程

linux 内核睡眠与唤醒

Linux进程状态详解及状态转换

ubuntu 进程睡眠怎么唤醒

11 linux011用于进程共享资源的睡眠与唤醒