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

命名管道的工作方式似乎有所不同。这是有意还是无意的?

我们将这两个脚本捕获为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

我的声誉不足以写评论,因此以答案的形式写。

你说的挂起是什么意思?在其他终端上pipe_reader.sh执行后会发生什么?pipe_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),但发行商提供了一些修复/补丁。管道功能不太可能因此次升级而改变。我相信破坏此类功能是内核开发人员所不愿看到的。

还发生了其他事情。

相关内容