给定一个在 C 程序 A 中打开的文件描述符fd
,我想以fd
U2 的形式打开程序 B。在我的系统(wsl2 ubuntu)上,execl("/usr/bin/su", "su", suarg1, "U2");
(其中 suarg1 是“-c B ” + toHex(fd))似乎可以工作,我可以通过解析第一个参数来访问 B 中的文件描述符。但是,我在任何文档中都找不到有关 su 保持文件描述符打开的任何内容,并且我不想依赖随时可能更改的行为。那么,有什么理由让它永远有效吗?或者,如果这确实取决于实施,我怎样才能以记录在案的工作方式实现类似的目标?
编辑:看来我还不够清楚。 Exec 的文档提到它使文件描述符保持打开状态,但是我在 su 的文档中找不到类似的内容。因此,我不确定是否可以相信它不会关闭它们。我确实尝试过,而且确实有效,但我想要其中一个
- 确认它可以在任何 Linux 上、任何情况下运行,或者
fd
从 A 到 B 的另一种方式是记录工作
简单地保持fd
开放会更好,但可靠性更重要。
答案1
这是 的副作用execl()
。它用新的过程映像替换当前的过程映像。它不会关闭当前打开的文件,并且替换会继承它们。这样做主要是为了让新进程能够访问 stdin/stdout/stderr,但没有人阻止您将其他一些文件传递给替换进程。