进程可以创建额外的 shell 可重定向文件描述符吗?

Posted

技术标签:

【中文标题】进程可以创建额外的 shell 可重定向文件描述符吗?【英文标题】:can a process create extra shell-redirectable file descriptors? 【发布时间】:2011-03-26 13:17:08 【问题描述】:

进程 'foo' 是否可以写入文件描述符 3,例如,在 bash shell 中可以这样做

foo 1>f1 2>f2 3>f3

如果是这样,你会如何(用 C 语言)编写它?

【问题讨论】:

【参考方案1】:

您可以使用以下命令开始您的命令:

./foo 2>/dev/null 3>file1 4>file2 

然后如果你 ls -l /proc/_pid_of_foo_/fd 你会看到文件描述符被创建了,你可以通过例如:

write(3,"abc\n",4);

如果您先检查文件描述符(使用 fcntl?),可能会少一些麻烦。

【讨论】:

【参考方案2】:

shell 在执行程序之前打开程序的文件描述符。只需像使用任何其他文件描述符一样使用它们,例如write(3, buf, len); 等。您可能需要进行错误检查以确保它们确实已打开(尝试 dup 它们然后关闭副本将是一项简单的检查)。

【讨论】:

【参考方案3】:

没有。

文件描述符由shell打开,子进程继承它们。打开这些命令行可访问文件描述符的不是子进程,而是 bash 进程。

可能有一种方法可以说服 bash 代表进程打开其他文件描述符。这不能移植到其他 shell,而且我不确定是否存在某种机制——我只是在猜测。

关键是您不能通过以特殊方式对子进程进行编码来做到这一点。外壳必须满足你的愿望。

【讨论】:

“这不能移植到其他 shell”,我很确定 N> whatever 表示法非常便携,至少对于 sh 和 bash 而言。虽然它不是很有用 - 除非进程实际上知道它必须写入 fd 编号 N。【参考方案4】:

进程“foo”是否可以写入文件描述符 3,例如,在 bash shell 中可以执行 [...],如果可以,您将如何编写它(在 C 中)?

我不确定你到底在追求什么,但不管它是什么,起点都将是 man dup/man dup2 - 这就是 shell 如何从随机文件描述符中生成具有给定编号的文件描述符。

但很明显,进程foo 必须以某种方式知道它可以写入文件描述符 3。POSIX 仅指定 0、1 和 2:shell 确保无论启动什么,都会在应用程序的上下文中获取文件描述符和 libc期望它们是标准输入/标准输出/标准错误。从 3 开始及以后 - 取决于应用程序开发人员。

【讨论】:

以上是关于进程可以创建额外的 shell 可重定向文件描述符吗?的主要内容,如果未能解决你的问题,请参考以下文章

shell文件描述符及重定向

Shell自定义输入输出文件描述符

18 shell 重定向以及文件描述符

小鸟初学Shell编程输入输出重定向

重新点亮shell————管道和重定向[二]

linux呈现数据