在信号处理程序中使用长数据。

时间:2021-05-02 20:49:50

How can I set a variable of type long (on 64 bit machine = 8 bytes) inside a signal handler? I've read that you can only use variables of type sig_atomic_t, which is actually implemented as volatile int inside a signal handler and it is unsafe to modify data types bigger than an int.

如何在信号处理程序中设置long类型的变量(在64位机器上= 8字节)?我已经读过你只能使用sig_atomic_t类型的变量,它实际上是在信号处理程序中实现为volatile int,修改大于int的数据类型是不安全的。

1 个解决方案

#1


4  

You can use a long inside a signal handler, you can use anything, in fact. The only thing you should take care of is proper synchronization in order to avoid race conditions.

事实上,你可以在信号处理程序中使用一个长的,你可以使用任何东西。你唯一应该注意的是正确的同步,以避免竞争条件。

sig_atomic_t should be used for variables shared between the signal handler and the rest of the code. Any variable "private" to the signal handler can be of any type, any size.

sig_atomic_t应该用于信号处理程序和其余代码之间共享的变量。信号处理程序的任何“私有”变量可以是任何类型,任何大小。

Sample code :

示例代码:

#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;
}

If you want to use a shared variable other than sig_atomic_t use atomics (atomic_long_read, atomic_long_set).

如果要使用除sig_atomic_t之外的共享变量,请使用atomics(atomic_long_read,atomic_long_set)。

#1


4  

You can use a long inside a signal handler, you can use anything, in fact. The only thing you should take care of is proper synchronization in order to avoid race conditions.

事实上,你可以在信号处理程序中使用一个长的,你可以使用任何东西。你唯一应该注意的是正确的同步,以避免竞争条件。

sig_atomic_t should be used for variables shared between the signal handler and the rest of the code. Any variable "private" to the signal handler can be of any type, any size.

sig_atomic_t应该用于信号处理程序和其余代码之间共享的变量。信号处理程序的任何“私有”变量可以是任何类型,任何大小。

Sample code :

示例代码:

#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;
}

If you want to use a shared variable other than sig_atomic_t use atomics (atomic_long_read, atomic_long_set).

如果要使用除sig_atomic_t之外的共享变量,请使用atomics(atomic_long_read,atomic_long_set)。