Linux:检查文件描述符是否可供读取

标签 linux bash file-descriptor

考虑以下示例,模拟一个在 10 秒后给出输出的命令:exec 5< <(sleep 10; pwd)

在 Solaris 中,如果我在 10 秒之前检查文件描述符,我可以看到它的大小为 0,这告诉我它尚未填充数据。我可以简单地每秒检查一次,直到满足文件测试条件(不同于 0),然后提取数据:

while true; do
    if [[ -s /proc/$$/fd/5 ]]; then
        variable=$(cat <&5)
        break
    fi
    sleep 1
done

但在 Linux 中我不能这样做(RedHat、Debian 等)。所有文件描述符都以 64 字节大小显示,无论它们是否保存数据。对于需要不同时间来转储输出的各种命令,我不知道何时应该读取文件描述符。不,我不想只是等待cat <&5最后,我需要知道何时应该执行 cat首先。因为我使用这种机制来发出同时命令并将其输出分配给相应的文件描述符。正如已经提到的,这在 Solaris 中效果很好。

最佳答案

这是一个想法的框架:

#!/bin/bash
exec 5< <(sleep 4; pwd)
while true
do
  if
    read -t 0 -u 5 dummy
  then
    echo Data available
    cat <&5
    break
  else
    echo No data
  fi
  sleep 1
done

来自 Bash 引用手册:

If timeout is 0, read returns immediately, without trying to read and data. The exit status is 0 if input is available on the specified file descriptor, non-zero otherwise.

这个想法是使用带有-t 0(零超时)和-u 5(从文件描述符5读取)的读取来立即检查数据可用性.

当然,这只是一个演示这个概念的玩具循环。

关于Linux:检查文件描述符是否可供读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42035816/

相关文章:

c++ - 如何在运行时查看 C 程序的内存布局?

linux - 如何使用主设备号和次设备号获取设备文件名

linux - 检查用户是否具有有效的登录 shell

linux - 我可以修改特定进程的标准输入描述符吗?

C套接字重定向

linux - 类似于 KDE 应用程序的 Gnome-Shell 仪表板

java - 创建jar并在没有IDE的Java程序中导入它

linux - Base64编码修改只是可打印的字符

c++ - Bash:获取子进程名称

遇到打开文件描述符消息时 Python 日志记录失败