首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用fd 3安全吗?

使用fd 3安全吗?
EN

Unix & Linux用户
提问于 2016-11-02 10:54:38
回答 1查看 1.9K关注 0票数 4

有几个问题可以使用它来完成像多个输出管道这样的事情而不使用进程替换:

用一个固定的fd号就可以安全了吗?是否有可能一个程序已经在使用它,就像这里描述的那样,我们覆盖了一些重要的东西,或者读到了一些无关的东西?

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2016-11-02 17:00:01

是否一个程序已经在使用它了?

不是的。您知道,I/O重定向发生在程序或脚本启动之前。

通常,当程序或脚本启动时,只打开标准描述符(0/标准输入、1/标准输出和2/标准错误)。(它们可能是指终端、设备、文件,甚至是网络套接字;但它们应该是开放的。我们没有“关闭”1,而是将不想要的描述符从/重定向到/dev/null,本质上是“无处”/“无”)。

程序通过像open这样使用免费描述符的系统来使用描述符。也就是说,他们不要求内核打开特定描述符的文件或套接字,而是由内核选择描述符。因此,当一个程序使用额外的描述符时,唯一的情况是当程序启动时它已经打开了。有一些罕见的实用程序守护进程--除了标准描述符之外,他们还期望,如果描述符3在启动时是打开的,那么它将连接到他们的管理服务(或类似的东西)。

如果程序决定使用硬编码描述符(唯一的原因,是因为它分叉并执行另一个程序,期望该描述符是打开的;正如我所说的,这是非常罕见的),当程序用它们用来替换它时,已经打开的描述符就会关闭。(顺便说一句,当程序表示要使用特定的描述符(例如,在dup2()系统中使用POSIXy )时,内核就会关闭;这个过程不需要关心。

Shell脚本(Bash和sh)使用固定的描述符号,因此脚本可能使用特定的描述符执行某些输入/输出重定向。但是,当发生这种情况时,前面的重定向就会被忽略,没有任何效果,因为脚本假定描述符已经关闭。(如果一个描述符是打开的,并且脚本将该描述符用于某些内部内容,那么当脚本重定向它时,原始描述符首先被关闭--通过内核,并且出于前面一段提到的原因)。若要发生任何类型的数据泄漏,脚本必须专门测试描述符是否已打开,并避免重定向。)

还请注意,Fortran I/O单元或通道与描述符无关,即使两者都使用数字进行标识。因此,即使Fortran程序使用单元10,也并不意味着它使用描述符10。

用一个固定的fd号就可以安全了吗?

是。POSIX说,一个程序至少可以打开20个描述符,所以在3到19之间的任何固定数字都应该工作得很好。

关键是很好地记录它,最好是在脚本开头的简短评论中(对于脚本),或者在用法(-h--help命令行选项)和手册页(对于程序)中。

对于脚本,您可以假设,如果出现冲突(如果冲突发生,则脚本根本无法工作,因为管道一启动就会关闭“,如上面详细介绍的那样),用户可以更改固定的描述符号,以更好地满足他们的需要。因此,作为脚本作者,您的任务是提前计划,并使后来者更容易。(描述您的意图和总体设计的清晰注释就足够了;不需要将描述符编号作为变量,也不必描述脚本所做的每一个小动作。)

对于程序来说,使其运行时可配置是一个好主意.例如,您可以让程序/守护进程使用描述符3 (如果打开的话)用于具有图形用户界面的特殊控制协议;但是,使用一些命令行选项,如‘-c5’,使用命名描述符(或者,对于-c /dev/name-c named-pipe-c :socketpath使用指定的文件、命名管道或本地域套接字)。这样,用户就可以轻松地处理与脚本之间的任何冲突。

票数 4
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/320510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档