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

标签 linux asynchronous signals

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

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

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

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

最佳答案

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

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

关于linux - 是否有一种异步信号安全的方式来读取 Linux 上的目录列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18513454/

相关文章:

c - 重定向标准流

linux - Docker 卷覆盖文件权限

python subprocess.call 不能正确处理信号

c++ - 将 sigwait 与 std::thread 和管道一起使用

linux - 无法启动可以在另一台机器上执行的docker容器

用于执行 Bash/ksh 环境和 shell 应用程序的 Python GUI?

javascript - 如何从 promise 中获取值(value)。回调返回未定义

javascript - Node JS 定时器 API 的执行顺序

C# 异步开始接收回调方法丢失了一些数据包

signals - 处理 PHP ^C CLI 脚本