C 进程能否创建额外的shell可重定向文件描述符?

C 进程能否创建额外的shell可重定向文件描述符?,c,linux,unix,file-descriptor,io-redirection,C,Linux,Unix,File Descriptor,Io Redirection,例如,进程“foo”是否可以在bashshell中写入文件描述符3 foo 1>f1 2>f2 3>f3 如果是这样的话,你会怎么写(用C)?不 文件描述符由shell打开,子进程继承它们。打开这些命令行可访问文件描述符的不是子进程,而是bash进程 可能有一种方法可以说服bash代表进程打开其他文件描述符。这将无法移植到其他shell,我也不确定是否存在一种机制——我只是猜测 关键是,您不能通过以特殊的方式编码子进程来实现这一点。贝壳必须满足你的欲望 例如,进程“foo”是

例如,进程“foo”是否可以在bashshell中写入文件描述符3

foo 1>f1 2>f2 3>f3
如果是这样的话,你会怎么写(用C)?

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


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

关键是,您不能通过以特殊的方式编码子进程来实现这一点。贝壳必须满足你的欲望

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

我不确定你到底在追求什么,但不管它是什么,起点将是-这就是shell如何将随机文件描述符转换成具有给定数字的文件描述符


但是显然,进程
foo
必须知道它可以写入文件描述符3。POSIX只指定了0、1和2:shell确保无论启动什么都会得到文件描述符,而应用程序上下文中的libc也希望它们是stdin/stdout/stderr。从3开始及以后-由application developer决定。

您可以使用以下命令启动命令:

./foo 2>/dev/null 3>file1 4>file2 
然后,如果您使用ls-l/proc/\u-pid\u of\u-foo\u/fd,您将看到文件描述符已创建,您可以通过以下方式对其进行写入:

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

如果您先检查文件描述符(使用fcntl?),可能就不会那么麻烦了。

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

“这将无法移植到其他shell”,我非常确定
N>任何
符号都是可移植的,至少对于sh和bash是如此。虽然它不是很有用-除非进程实际知道它必须写入fd编号N。