- 论坛徽章:
- 17
|
回复 1# cxm240
其实所有的问题本质上只是一个“Async-Signal-Safe Function”调用问题,你要保证你在signal handler中调用函数都是“Async-Signal-Safe Function”的,这将保证不会有错误(否则会发生死锁等状况,但毕竟调用会被中断不能保证逻辑上的正确性,比如说字符输出了一半等)。根据你设置signal handler的不同,“Async-Signal-Safe Function”将具有不同的行为。使用signal设置signal handler默认设置了SA_RESTART标志位。这个标志位可以使用sigaction修改。如果设置了SA_RESTART那么在signal handler中的阻塞调用被另一个信号中断时将重启,否则返回EINTR。由于glibc中的自己会作信号处理,所以调用printf这样的函数将会导至不确定性。也就是说如果你想保证输出backtrace安全,不能调用printf这样的glibc中的函数,而应该调用符合“Async-Signal-Safe Function”标准系统函数write向终端中输出,虽然也不能保证输出完整性,但可以保证程序不会出现错误。如果要做的更完善那么可以把可以阻塞的信号都阻塞掉来尽量保证输出的完整性。但这样的意义已经不太大了。 |
|