Основная обработка сигналов в C ++

Это довольно простой сценарий, но я не нахожу слишком много полезных ресурсов. У меня есть программа C ++, работающая в Linux, которая выполняет обработку файлов. Читает строки, выполняет различные преобразования, записывает данные в базу данных. Есть определенные переменные (хранящиеся в базе данных), которые влияют на обработку, которую я в настоящее время читаю на каждой итерации, потому что я хочу, чтобы обработка была как можно более актуальной, но небольшая задержка - это нормально. Но эти переменные меняются довольно редко, и чтения со временем обходятся дорого (10 миллионов плюс строки в день). Я мог бы разнести чтения каждомуn итерации или просто перезапустите программу, когда переменная меняется, но они кажутся хакерскими.

Вместо этого я хотел бы, чтобы программа вызывала перечитывание переменных при получении SIGHUP. Все, что я читаю об обработке сигналов, говорит о библиотеке сигналов C, которую я не знаю, как связать с классами моей программы. Библиотеки сигналов Boost, похоже, больше связаны с межобъектной связью, чем с обработкой сигналов ОС.

Кто-нибудь может помочь? Кажется, что это должно быть невероятно просто, но я довольно заржавел с C ++.

Ответы на вопрос(4)

не обязательно было бы излишним реализовывать их все:

Отвечать на определенный сигнал, так же, как это делает С. C ++ работает так же. Смотрите документацию дляsignal().Запуск по метке времени изменения какого-либо файла, например, базы данных, если она хранится в плоском файле.Триггер один раз в час или один раз в день (что имеет смысл).

соответствующий сигналу OS, и привязать сигнал Boost к вашему слоту, чтобы вызвать соответствующий обработчик.

эта ссылка который дает подробную информацию о регистрации сигнала.

Если я не ошибаюсь, важно помнить, что любая функция внутри объекта ожидает параметр-референт, что означает, что нестатические функции-члены не могут быть обработчиками сигналов. Я считаю, что вам нужно зарегистрировать его либо в статической функции-члене, либо в какой-то глобальной функции. Оттуда, если у вас есть конкретная объектная функция, о которой вы хотите позаботиться о своем обновлении, вам потребуется способ ссылки на этот объект.

 Nikola Novak23 янв. 2014 г., 08:38
Этот сайт выглядит закрытым, так что вы можете проверитьэта ссылка для деталей.
 Bryan25 янв. 2014 г., 02:44
Нет, cplusplus.com (и эта ссылка) все еще кажутся мне подходящими. Всегда хорошо иметь несколько ссылок, хотя.
Решение Вопроса

как вы могли бы справиться с этим в C. Я думаю, что вполне нормально иметь отдельную функцию-обработчик сигналов, поскольку вы будете просто публиковать в семафор или устанавливать переменную или что-то подобное, что другой поток или Объект может проверить, чтобы определить, нужно ли ему перечитать настройки.

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

/* or you might use a semaphore to notify a waiting thread */
static volatile sig_atomic_t sig_caught = 0;

void handle_sighup(int signum) 
{
    /* in case we registered this handler for multiple signals */ 
    if (signum == SIGHUP) {
        sig_caught = 1;
    }
}

int main(int argc, char* argv[]) 
{
    /* you may also prefer sigaction() instead of signal() */
    signal(SIGHUP, handle_sighup);

    while(1) {
        if (sig_caught) {
            sig_caught = 0;
            printf("caught a SIGHUP.  I should re-read settings.\n");
        }
    }

    return 0;
}

Вы можете проверить отправкуSIGHUP используяkill -1 `pidof yourapp`.

 R Samuel Klatchko29 сент. 2010 г., 01:33
Если вы хотите соответствовать стандартам, убедитесь, что ваш обработчик сигналов квалифицирован какextern "C"
 KernelM29 сент. 2010 г., 01:28
Ой дух Я полностью переосмыслил это и забыл, что переменные сигнала - это то, что я хочу, а не прямой вызов.headdesk
 John Ledbetter29 сент. 2010 г., 01:42
@R Самуэль: Это замечательный момент. Я даже не думал оextern "C" с тех пор как я писал код на C, но ОП понадобится!

Ваш ответ на вопрос