信号处理程序异步安全函数
Signal handler async safe functions
有没有一种方法可以在信号处理程序中调用非异步安全函数?或者这是不可能的?
我不想在信号处理程序中设置标志,然后在我的"主代码"中打印一些东西,但在这种情况下,信号处理程序将自己定义程序的逻辑流。
有没有一种方法可以在信号处理程序中调用非异步安全函数?或者这是不可能的?
没有。不安全。这样做会导致未定义的行为——很可能是死锁,但也可能发生其他事情。
任何函数调用被标记为"异步信号安全"的原因都是为了将其标记为可以在信号处理程序中进行安全调用。
来自signal(7)
Linux手册页:
异步信号安全功能
信号处理程序函数必须非常小心,因为处理其他地方可能会在执行过程中的某个任意点中断程序的。POSIX具有"安全功能"的概念。如果信号中断了不安全函数的执行,并且处理程序调用不安全的函数,则程序的行为为未定义。
POSIX.1-2004(也称为POSIX.1-2001技术勘误表2)需要实现以保证以下功能可以在信号处理程序中安全地调用:
如果函数调用没有列出,那么从信号处理程序中调用它是不安全的。
从技术上讲,您可以在信号处理程序中调用或编写任何函数——没有什么可以阻止您这样做。
不鼓励使用它的原因是,当信号处理程序处理您的操作时,可能会引发另一个信号,这可能会使信号处理程序跳到优先级更高的信号处理程序。
这种情况会导致竞争和难以调试的问题,因为我们不知道信号处理的顺序。
这就是为什么信号处理程序应该是轻量级的,以避免难以调试的竞争条件,通常我们设置标志来指示信号已被引发,并在读取这些标志的主线程或其他线程中处理它。
相关文章:
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 如何将元素添加到数组的线程安全函数?
- 在函数结束后使用指向变量的指针是否安全?
- 线程调用的函数对对象删除是否安全?
- 为表示一个或多个操作的C++函数的int参数寻找类型安全的替换
- 由并发无序映射查找线程调用的函数是否安全?
- 析构函数和线程安全
- 从其存储的回调中删除 std::函数是否安全
- 将正常函数的工作分配给多个线程是否安全
- 通过std::shared_ptr使用Rcpp和RcppParallel的线程安全函数指针
- 从函数安全返回和处理动态分配的内存,C++ 11
- 是STD :: REGEX构造函数安全
- 用return语句结束析构函数安全吗
- 编写非虚拟条件成员函数安全吗
- 在抽象构造函数/析构函数中调用纯虚拟函数安全吗
- 依赖隐式声明的move构造函数安全吗
- 正在从vtable的析构函数安全抛出异常
- 正在使用shared_ptr和weak_ptr来管理std::函数安全的生命周期
- c++删除/析构函数安全调用
- 在派生类中声明非虚析构函数安全吗?