Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 信号处理程序异步安全函数_C++_C_Function_C++11_Signals - Fatal编程技术网

C++ 信号处理程序异步安全函数

C++ 信号处理程序异步安全函数,c++,c,function,c++11,signals,C++,C,Function,C++11,Signals,有没有一种方法可以从信号处理程序中调用非异步安全函数?或者这是不可能的 我不希望在信号处理程序中设置一个标志,然后在我的“主代码”中打印一些内容,但在这种情况下,信号处理程序将定义我的程序本身的逻辑流。从技术上讲,你可以调用或编写信号处理程序中的任何函数,没有什么可以阻止你这样做 不鼓励它的原因是,当信号处理程序处理您的操作时,可能会引发另一个信号,这可能会使信号处理程序跳转到更高优先级的信号处理程序 这种情况会导致竞争和难以调试的问题,因为我们不知道信号处理的顺序 这就是为什么信号处理程序应该

有没有一种方法可以从信号处理程序中调用非异步安全函数?或者这是不可能的


我不希望在信号处理程序中设置一个标志,然后在我的“主代码”中打印一些内容,但在这种情况下,信号处理程序将定义我的程序本身的逻辑流。

从技术上讲,你可以调用或编写信号处理程序中的任何函数,没有什么可以阻止你这样做

不鼓励它的原因是,当信号处理程序处理您的操作时,可能会引发另一个信号,这可能会使信号处理程序跳转到更高优先级的信号处理程序

这种情况会导致竞争和难以调试的问题,因为我们不知道信号处理的顺序

这就是为什么信号处理程序应该是轻量级的,以避免难以调试的竞争条件,通常我们设置标志来指示信号已被触发,并在读取这些标志的主线程或另一个线程中处理它

有没有一种方法可以从信号处理程序中调用异步安全函数?或者这是不可能的

不,不安全。这样做会导致未定义的行为——很可能是死锁,但也会发生其他事情

任何函数调用被标记为“async signal safe”的原因都是为了将其标记为可以从信号处理程序中安全调用

从:

异步信号安全功能

信号处理函数必须非常小心,因为 在执行过程中的某个任意点,其他位置可能会被中断 是节目的一部分。POSIX具有“安全功能”的概念。如果 信号中断不安全函数的执行,处理程序 调用不安全的函数,则程序的行为 未定义

POSIX.1-2004(也称为POSIX.1-2001技术勘误表2) 需要一个实现来保证以下功能 可以在信号处理程序中安全调用:


如果函数调用未列出,则从信号处理程序中调用它是不安全的。

对不起,我指的是非异步安全函数!“有没有一种方法可以从信号处理程序中调用非异步安全函数?”没有,至少没有安全的方法。仍然有点困惑,如果信号处理程序调用安全函数,仍然可能会引发另一个信号,这可能会使信号处理程序跳转到更高优先级的信号处理程序。那么,使用安全函数和不安全函数之间有什么区别呢?