进程可以创建额外的 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 可重定向文件描述符吗?的主要内容,如果未能解决你的问题,请参考以下文章