Использование длинных данных внутри обработчика сигнала. - PullRequest
4 голосов
/ 30 июля 2011

Как я могу установить переменную типа long (на 64-битной машине = 8 байт) внутри обработчика сигнала?Я читал, что вы можете использовать только переменные типа sig_atomic_t, которые на самом деле реализованы как volatile int внутри обработчика сигнала, и небезопасно изменять типы данных больше, чем int.

1 Ответ

4 голосов
/ 30 июля 2011

Вы можете использовать long внутри обработчика сигнала, вы можете использовать все что угодно.Единственное, о чем вы должны позаботиться, это о правильной синхронизации, чтобы избежать условий гонки.

sig_atomic_t следует использовать для переменных, совместно используемых обработчиком сигнала и остальной частью кода.Любая переменная "private" для обработчика сигнала может иметь тип любой , любой размер.

Пример кода:

#include <signal.h>

static volatile long badShared; // NOT OK: shared not sig_atomic_t
static volatile sig_atomic_t goodShared; // OK: shared sig_atomic_t

void handler(int signum)
{
    int  localInt  = 17;
    long localLong = 23; // OK: not shared

    if (badShared == 0) // NOT OK: shared not sig_atomic_t
        ++badShared;

    if (goodShared == 0) // OK: shared sig_atomic_t
        ++goodShared;
}

int main()
{
    signal(SOMESIGNAL, handler);
    badShared++; // NOT OK: shared not sig_atomic_t
    goodShared++; // OK: shared sig_atomic_t

    return 0;
}

Если выхотите использовать переменную общего доступа, отличную от sig_atomic_t use atomics (atomic_long_read, atomic_long_set).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...