我只是想知道是否可以在信号处理程序中调用非异步安全函数。
来自 Linux 手册页 signal(7) 的引用:
如果信号中断了不安全函数的执行,并且处理程序调用了不安全函数,则程序的行为是未定义的。
和TLPI:
SUSv3 指出,表 21-1(异步安全函数列表)中未列出的所有函数都被认为对信号不安全,但指出只有在调用信号处理程序中断一个函数的执行时,该函数才是不安全的。 unsafe 函数,并且处理程序本身也调用了 unsafe 函数。
我对上述引用的解释是,只有当信号处理程序没有中断非异步安全函数时,才可以安全地从信号处理程序调用非异步安全函数。
例如,我为 SIGINT 安装了一个处理程序,它调用了一个假定crypt(3)
为不可重入即不安全的不安全函数。
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART;
sa.sa_handler = handler;
sigaction(SIGINT, &sa, NULL);
而且我还调用printf()
了一个无限循环main()
,我只有主线程在运行。
printf()
问题是这个简单的例子,当处理程序中断执行并调用不安全的函数时,我没有看到任何不好的事情发生。AFAK,printf()
将获得一个控制台锁,并有一个内部缓冲区来执行缓冲的 I/O,但它的状态在这个例子中是一致的。虽然crypt()
返回一个静态分配的字符串,但它不与其他函数或线程共享。
我是不是误会了什么?我希望有人澄清一下,让信号处理程序中断主程序中不安全函数的执行并且本身也调用不安全函数或者在某些情况下这样做是安全的(例如上面的简单示例)总是不安全的?