2

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

foo 1>f1 2>f2 3>f3

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

4

4 回答 4

3

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

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

然后,如果您 ls -l /proc/_pid_of_foo_/fd 您将看到文件描述符已创建,您可以通过以下方式写入它们:

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

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

于 2010-08-06T21:49:00.420 回答
2

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

于 2010-08-07T14:11:45.547 回答
1

不。

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

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

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

于 2010-08-06T20:46:07.803 回答
1

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

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

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

于 2010-08-06T21:46:02.847 回答