Здравствуйте, 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.