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

名前付きパイプの動作に違いがあるようです。これは意図的なものでしょうか?

次の 2 つのスクリプトを pipe_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"

そして pipe_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 つのスクリプトを複数回実行したり、その他の手順の違いが問題になることはありません。

答え1

コメントを書くほどの評判がないので、回答として書きます。

ハングとはどういう意味ですか? 実行すると他のターミナルで何が起こりますpipe_reader.shpipe_writer.sh?

また、両方のスクリプトを実行した後、コマンドは次のようになります。

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

見せる?

複数の.pipe_readerスクリプトを実行したため、最初のスクリプトのみがpipe_writerの出力を受け取っている可能性があります。次のことを確認してください。

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

1を返す

答え2

私の理解では、3.13.0-55 と 3.13.0-65 はどちらも同じカーネル (3.13) ですが、ディストリビューション プロバイダーによっていくつかの修正/パッチが適用されています。このアップグレードでパイプ機能が変更される可能性は低いでしょう。そのような機能を破壊することはカーネル開発者に嫌われると思います。

何か別のことが起こっています。

関連情報