Bash文件描述符泄漏

时间:2010-04-15 21:51:05

标签: bash

运行以下代码时出现文件描述符泄漏:

function get_fd_count() {
        local fds
        cd /proc/$$/fd; fds=( * ) # avoid a StackOverflow source colorizer bug
        echo "${#fds[@]}"
}

function fd_leak_func() {
        while : ; do
                echo ">> Current FDs: $(get_fd_count)"
                read retval new_state < <(set +e; new_state=$(echo foo); retval=$?; printf "%d %s\n" $retval $new_state)
        done
}

fd_leak_func

在3.2.25和4.0.28上进行了测试。

只有在函数内发生循环时才会发生这种情况;每次我们返回顶级上下文时,额外的文件描述符都会被关闭。

这是预期的行为吗?更重要的是,有可用的解决方法吗?


跟进:在向bash-bug邮件列表报告后,这被确认为一个错误。 Chet表示将在下一个版本中包含修复程序(截至2010年4月17日)。

3 个答案:

答案 0 :(得分:3)

这是一个简化的例子:

$ fd_leaker() { while :; do read a < <(pwd); c=(/proc/$$/fd/*); c=${#c[@]}; echo $c; done; } 
$ fd_leaker

使用/bin/true并没有解决这个问题,但是它主要通过使用(exit 0)来修复但是我得到了“bash:echo:写错误:系统调用中断”错误使用“修复”或者如果我使用/bin/pwd代替内置pwd

它似乎也特定于read。我试过grep . < <(pwd) > /dev/null并且它运行正常。当我尝试while read a; do :; done < <( pwd)

以下形式的额外文件描述符:

lr-x------ 1 user user 64 2010-04-15 19:26 39 -> pipe:[8357879]

我真的不认为它们的失控创造是有意的,毕竟没有任何递归发生。我真的不知道在循环中添加一些内容应该如何解决问题。

答案 1 :(得分:2)

在循环结束处放置/bin/true会修复它,但我不知道为什么或如何,或者为什么它首先发生。

答案 2 :(得分:1)

似乎在bash-4.2中修复了。我用bash-4.2.28进行了测试,特别是