4

SUSv4没有在其异步信号安全函数列表中列出 opendir、readdir、closedir 等。

是否有从信号处理程序读取目录列表的安全方法?

例如,是否可以“打开”目录并以某种方式删除原始目录列表?如果是这样,“读取”返回什么样的数据结构?

或者也许在 Linux 上,即使 SUSv4 / POSIX 不需要可以使用它,某些系统调用也是异步信号安全的?

4

1 回答 1

2

如果您事先知道需要读取哪个目录,则可以在信号处理程序之外调用 opendir()(opendir() 调用 malloc(),因此您不能从处理程序中运行它)并将 DIR* 保存在某处的静态变量。当您的信号处理程序运行时,您应该能够在该句柄上调用 readdir_r() ,只要您可以保证在任何时候只有一个信号处理程序会使用 DIR* 句柄。DIR 中有一个由 readdir() 和 readdir_r() 获取的锁定字段,因此,如果您使用了来自两个信号处理程序的 DIR*,或者您注册了相同的处理程序来处理多个信号,您可能最终会由于锁从未被中断的处理程序释放而导致死锁。

在调用 fork() 之后但在调用 execve() 之前,类似的方法似乎也适用于从子进程读取目录。

于 2014-06-27T10:55:23.870 回答