2017-02-04 109 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'變量,因爲即使數據可用,語法也沒有它,它將不會被填充。 –

相關問題