【问题标题】:zsh: Do I need to close file descriptors?zsh:我需要关闭文件描述符吗?
【发布时间】:2020-07-17 09:32:25
【问题描述】:

我使用以下代码将某些内容输出到标准输出,并将其通过管道传输到程序:

function example() {
    local fd1
    {
        exec {fd1}>&1
        { echo hi >&$fd1 } | true
    } always { exec {fd1}>&- }
}

我想知道我是否可以安全地放弃always { exec {fd1}>&- }fd1 在函数完成后超出范围。

【问题讨论】:

  • 这是一个主观问题,不太可能得到明确的答案。简短的回答是,您不必这样做,但这样做是一种“好”的做法
  • @Inian 在什么情况下它会产生任何不良后果?
  • @Inian 这并不比“即使最后一个指向它的指针超出范围,我还需要在 malloc 后释放内存吗?”更主观吗?

标签: zsh file-descriptor io-redirection


【解决方案1】:

您需要保留always { exec {fd1}>&- }。如果你摆脱它,包含文件描述符的变量将超出范围,但文件描述符不会被关闭,导致它泄漏。您可以通过在没有该行的情况下运行您的函数之前和之后执行 ls -l /proc/$$/fd 来看到这一点。该函数的每次运行都会将另一个 FD 永久添加到该列表中。最终,您将用完文件描述符并且无法打开任何新的描述符,这会破坏一切。

【讨论】:

    猜你喜欢
    • 2010-09-21
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 2017-08-22
    相关资源
    最近更新 更多