SUSv4未在其异步信号安全函数列表中列出opendir,readdir,closedir等。
有没有一种安全的方法从信号处理程序中读取目录列表?
e.g。是否有可能“打开”目录并以某种方式剔除原始目录列表?如果是这样,'read'返回什么样的数据结构?
或者在Linux上,某些系统调用是异步信号安全的,即使SUSv4 / POSIX不需要它可以使用吗?
答案 0 :(得分:1)
如果您事先知道需要读取哪个目录,可以在信号处理程序外调用opendir()(opendir()调用malloc(),这样就无法在处理程序中运行它)并保持DIR *在某个静态变量中。当你的信号处理程序运行时,你应该能够在该句柄上调用readdir_r(),只要你能保证在任何时刻只有那个信号处理程序会使用DIR *句柄。在DIR中有一个由readdir()和readdir_r()获取的锁定字段,因此,如果您使用了来自两个信号处理程序的DIR *,或者您注册了相同的处理程序来处理多个信号,那么您最终可能会由于锁定永远不会被中断的处理程序释放而导致死锁。
类似的方法似乎也可以在调用fork()之后但在调用execve()之前从子进程读取目录。