在信号处理程序中使用长数据
Using long data inside signal handler.
如何在信号处理程序中设置类型为long
的变量(在64位机器上= 8字节)?我读到你只能使用类型sig_atomic_t
的变量,这实际上是在信号处理程序中实现的volatile int
,修改大于int
的数据类型是不安全的。
您可以在信号处理程序中使用long
,实际上您可以使用任何东西。您唯一需要注意的是适当的同步,以避免竞争条件。
sig_atomic_t
应该用于信号处理程序和其他代码之间共享的变量。信号处理程序的任何"私有"变量都可以是任意类型,任意大小。
#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
以外的共享变量,请使用atomics (atomic_long_read
, atomic_long_set
)
相关文章:
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 有可能在信号处理程序中设置promise吗
- 在信号处理程序中捕获C++未处理的异常并恢复应用程序
- 调试和自由执行中的信号处理
- 通过安装信号处理程序关闭多线程应用程序
- 为什么我的信号处理程序只执行一次?
- GTK C++:找不到信号处理程序 您是否使用 -rdynamic 进行了编译?
- C++ 在信号处理程序后继续执行
- 没有信号处理程序的POSIX定时器的目的是什么?
- 为什么这个信号处理程序不能捕获 SIGHUP 或 SIGQUIT?
- 如何在C++中使用 std::bind 函数作为信号处理程序?
- 在 C++17 中,是否未定义使用无锁原子学保护从信号处理程序传递的数据?
- 如何将信号处理程序添加为方法
- 窗口上信号处理程序的异步安全写入函数
- 使用信号处理程序处理从 FIFO 接收的数据
- gtkmm/glade - 将信号处理程序连接到 MenuShell
- 实时绘图的信号处理数据(c++中的FFT和GNUPLOT)
- 是否有任何本机 gtkmm 类可以从小部件的信号处理程序函数中排队命令/数据
- 在信号处理程序中使用长数据