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

时间:2010-08-06 20:43:08

标签: c linux unix file-descriptor io-redirection

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

foo 1>f1 2>f2 3>f3

如果是这样,你会怎么写(在C中)?

4 个答案:

答案 0 :(得分:3)

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

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

然后,如果您使用-l / proc / _pid_of_foo_ / fd,您将看到创建了文件描述符,您可以通过例如:。

写入它们。
write(3,"abc\n",4);

如果您首先检查文件描述符(使用fcntl?),那么它就不那么容易了。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

没有

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

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

关键是你不能以特殊的方式对子进程进行编码。外壳必须遵守你的愿望。

答案 3 :(得分:1)

  

进程'foo'是否可以写入文件描述符3,例如,在bash shell中可以执行[...],如果是这样,你会如何编写它(在C中)?

我不确定你究竟是在追求什么,但无论它是什么,起点都是man dup/man dup2 - 这就是shell如何用随机文件描述符构成一个给定数字的文件描述符。

但显然,进程foo必须知道它可以写入文件描述符3. POSIX只指定0,1和2:shell确保启动的任何内容都获取应用程序中的文件描述符和libc context也期望它们是stdin / stdout / stderr。从3及更高版本开始 - 取决于应用程序开发人员。