进程'foo'是否可以写入文件描述符3,例如,在bash shell中可以执行
foo 1>f1 2>f2 3>f3
如果是这样,你会怎么写(在C中)?
答案 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及更高版本开始 - 取决于应用程序开发人员。