Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.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 sem_等待和信号处理器_C_Linux_Semaphore_Signals_Signal Handling - Fatal编程技术网

C sem_等待和信号处理器

C sem_等待和信号处理器,c,linux,semaphore,signals,signal-handling,C,Linux,Semaphore,Signals,Signal Handling,为什么不能在信号处理程序中使用sem_wait(尤其是每个线程的SIGSEGV信号)?有人能给我一个示例场景,它将使应用程序崩溃吗?我猜sem\u wait是可重入的和线程安全的,那么这里的问题是什么呢?为什么它不是异步安全的?如果应用程序在信号量值为零时接收到信号,而接收信号的线程恰好是应该增加信号量值的线程(sem\u post),该怎么办?如果然后在信号处理程序中调用sem_wait,进程将死锁,不是吗 当然,另一个论点可能是,如果sem_wait不在异步信号安全函数的列表中,那么实现可以

为什么不能在信号处理程序中使用
sem_wait
(尤其是每个线程的SIGSEGV信号)?有人能给我一个示例场景,它将使应用程序崩溃吗?我猜
sem\u wait
是可重入的和线程安全的,那么这里的问题是什么呢?为什么它不是异步安全的?

如果应用程序在信号量值为零时接收到信号,而接收信号的线程恰好是应该增加信号量值的线程(sem\u post),该怎么办?如果然后在信号处理程序中调用sem_wait,进程将死锁,不是吗


当然,另一个论点可能是,如果sem_wait不在异步信号安全函数的列表中,那么实现可以自由调用NASIC demons。

异步安全是比线程安全更严格的要求。您可以使用原语编写线程安全代码,以保护具有关键部分的全局数据。信号处理程序不能依赖于此。例如,您可能在sem_wait中的一个关键部分内,同时执行导致SEGFULT的操作。这将破坏sem_wait的线程安全保护

由于以下原因,sem_wait不能在信号处理程序中使用:

线程A在sem1上调用sem_wait。当线程A完成时,它将发布到sem1。但是,在它完成之前,接收到信号,然后输入处理程序,调用sem_wait on sem1。由于A是一个将发布到sem1的处理程序,因此处理程序将永远不会返回,并且将出现死锁。这就是为什么在信号处理器中永远不要等待任何东西是一条好规则。ASFAIK,问题更多地与死锁有关,而不是崩溃

此外,这违反了信号处理程序的理想用途,即处理外部中断,然后快速返回到您正在执行的操作


最后,摆脱SIGSEGV而不是处理它不是一个更好的目标吗

我建议您添加信号量应该保护您免受的操作类型(线程、中断、异常等)。这有很大的不同。相关:。我认为
sem\u wait(&x)
sem\u wait(&x)
在同一个
x
上发生冲突显然是一个问题,但它应该可以使用不同的信号量,尽管从技术上讲这仍然是未定义的行为。