SUSv4没有在它的异步信号安全函数列表中列出opendir、readdir、closedir等。
有没有一种从信号处理程序读取目录列表的安全方法?
例如,有没有可能“打开”目录,然后以某种方式擦出原始目录列表?如果是这样,那么'read‘返回什么样的数据结构?
或者,也许在Linux上,某些系统调用是异步信号安全的,即使SUSv4 / POSIX不需要它也可以使用?
发布于 2014-06-27 18:55:24
如果事先知道需要读取哪个目录,可以在信号处理程序外部调用opendir() (opendir()调用malloc(),因此不能从处理程序内部运行它),并将DIR*保存在某个静态变量中。当您的信号处理程序运行时,只要您可以保证在任何时刻只有一个信号处理程序使用readdir_r*句柄,您就应该能够在该句柄上调用DIR()。在DIR中有一个由readdir()和readdir_r()获取的lock字段,因此,如果您使用了来自两个信号处理程序的DIR*,或者您注册了同一个处理程序来处理多个信号,您可能会因为被中断的处理程序从未释放锁而导致死锁。
类似的方法似乎也适用于在调用fork()之后但在调用execve()之前从子进程读取目录。
https://stackoverflow.com/questions/18513454
复制相似问题