2017-02-04 111 views
0

考虑下面的例子中,模仿其10秒后给出的输出命令:exec 5< <(sleep 10; pwd)Linux系统:检查是否文件描述符可以读取

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

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

但对于Linux来说,我不能这样做(红帽,Debian的等)。无论数据是否保存,所有文件描述符的大小均为64字节。对于需要花费大量时间来转储它们的输出的各种命令,我不知道我应该何时读取文件描述符。不,我不想等到cat <&5完成,我需要知道什么时候我应该首先执行cat。因为我正在使用此机制来发出同时发出的命令并将其输出分配给相应的文件描述符。如前所述,这在Solaris中非常适用。

回答

3

这里是一个想法的骨架:

#!/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 

从猛砸参考手册:

如果超时时间为0,读立即返回,但不尝试读取和 数据。如果输入在指定文件 描述符上可用,则退出状态为0,否则为非零。

的想法是使用具有-t 0阅读(具有零超时)和-u 5(从文件描述符5读取)立即查询数据的可用性。

当然这只是一个玩具循环来展示这个概念。

+0

完美地工作,谢谢。我知道'read'能够......从文件描述符中读取,但从来没有想过使用'-t'会做什么。我删除了'dummy'变量,因为即使数据可用,语法也没有它,它将不会被填充。 –

相关问题