Linux 核心升級破壞了命名管道

Linux 核心升級破壞了命名管道

我們注意到 Linux 核心升級後命名管道發生了變化。使用來自的腳本http://www.linuxjournal.com/content/using-named-pipes-fifos-bash,我們能夠複製這個問題。這些腳本適用於

Linux TEST05 3.13.0-55-generic #94-Ubuntu SMP Thu Jun 18 00:27:10 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

但堅持住

Linux TEST01 3.13.0-65-generic #106-Ubuntu SMP Fri Oct 2 22:08:27 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

命名管道的工作方式似乎有所不同。這是有意還是無意?

我們將這兩個腳本捕獲為 pipeline_reader.sh:

#!/bin/bash

pipe=/tmp/testpipe

trap "rm -f $pipe" EXIT

if [[ ! -p $pipe ]]; then
    mkfifo $pipe
fi

while true
do
    if read line <$pipe; then
        if [[ "$line" == 'quit' ]]; then
            break
        fi
        echo $line
    fi
done

echo "Reader exiting"

和 pipeline_writer.sh:

#!/bin/bash

pipe=/tmp/testpipe

if [[ ! -p $pipe ]]; then
    echo "Reader not running"
    exit 1
fi


if [[ "$1" ]]; then
    echo "$1" >$pipe
else
    echo "Hello from $$" >$pipe
fi

有解決辦法嗎?

編輯:

我們在自己的終端中運行每個腳本。它們掛起的意思是編寫器腳本永遠不存在,並且讀取器腳本永遠不會顯示正常的「Hello from...」輸出。我們在兩個核心版本下以相同的方式執行它們,因此這不是多次運行一個腳本的問題,也不是任何其他程式差異的問題。

答案1

我沒有足夠的聲譽來寫評論,所以寫下作為答案。

你說的掛是什麼意思?pipe_reader.sh與您pipe_writer.sh在其他終端中執行相比會發生什麼?

另外,執行這兩個腳本後,指令執行什麼操作:

ls -al /proc/$(pgrep pipe_reader.sh)/fd

展示?

也許您已經執行了多個 .pipe_reader 腳本,因此只有第一個腳本接收到 pipeline_writer 輸出?確保

ps aux | grep pipe_reader | grep -v grep | wc -l 

返回 1

答案2

據我了解,3.13.0-55 和 3.13.0-65 都是相同的核心 (3.13),並由發行提供者提供了一些修復/補丁。此次升級不太可能改變管道功能。我相信破壞此類功能會引起核心開發人員的不滿。

還有其他事情正在發生。

相關內容