разбуди спящего демона по сигналу SIGQUIT - PullRequest
0 голосов
/ 12 апреля 2019

У меня проблема с моей программой-демоном, написанной на 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 голосов
/ 12 апреля 2019

Что я должен написать в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...