Re[6]: управление демоном
От: aka50 Россия  
Дата: 05.09.05 10:09
Оценка:
Здравствуйте, Force_Majeure, Вы писали:

F_M>Здравствуйте, aka50, Вы писали:


A>>2. unix socket — это уже полноценный канал управления.


F_M>Похоже действительно оптимальный путь — создать сокет и через него командами управлять демоном.

Более того, это еще и безопасно. В обработчике сигналов можно только атомарные и реентрабельные (с возможностью
повторного входа) функции использовать можно. По этому я обычно делал так:

#define SIGSOCK_WRFD 0
#define SIGSOCK_RDFD 1
int g_sigsock[2]; // это можно при старте сосздать как socketpair(AF_UNIX ...)

//где-то в main()
{
     socketpair(AF_UNIX, SOCK_DGRAM, 0, g_sigsock); // можно и SOCK_STREAM, но если буфер переполнится
                                                    // можно в send() заблокироваться. А он там не большой (вроде 
                                                    // 32к в FreeBSD... точно уже не помню)
}

sig_handler(int sig)
{
    case SIGHUP:
       send(g_sigsock[SIGSOCK_RDFD], "H", 1, 0);
       break;
    ....
}

// где-то в коде через select или просто в блокирующем режимe
// в другой нити

{
    char sigchar[1];
    int rc = recv(g_sigsock[1], sigchar, 1, 0);
    if (rc // ошибка можно завершаться ;) )
...
    switch (sigchar[0])
    {
        case 'H':
          // тут пинаем другие потоки или еще что-то делаем чтобы обработать HUP
    }

}

Помимо разных бонусов это еще позволяет сериализовать поступающие сигналы и не получить
какойнибудь UB.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.