Вы можете использовать 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
).