是否有一种异步信号安全的方式来读取 Linux 上的目录列表?

2024-06-08

SUSv4 http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04_03_03未在其异步信号安全函数列表中列出 opendir、readdir、closedir 等。

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

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

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


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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否有一种异步信号安全的方式来读取 Linux 上的目录列表? 的相关文章

随机推荐