stdin、stdout、stderr 文件描述符默认为 0、1 和 2。但是,当我通过 打开文件后fd = open(foo, 0),我发现fd现在是 1。1 用于新的文件描述符。现在 stdout 文件描述符是什么?或者它已关闭,我需要重新打开它?如果是,怎么办?有没有办法保留 0、1、2 个文件描述符并使用 3 个文件描述符?
/* readslow from the book with my "improve": the unix programming environment */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define SIZE 512
int main (int argc, char *argv[])
{
char buf[SIZE];
int n, fd;
int t = 10;
if ((argc > 1) && (fd = open(argv[1], 0) == -1)) {error("can't open %s", argv[1]);}
fprintf(stderr, "%d", fd);
for (;;) {
while ((n = read(fd, buf, sizeof buf)) > 0)
write(1, buf, n);
sleep(t);
}
}
Run Code Online (Sandbox Code Playgroud)
fprintf(stderr, "%d", fd)会给我 1。
[撰写此答案时问题中没有代码。open我接受了OP的声明,即由is返回的文件描述符1,但由于括号放错了位置,结果证明这是不正确的。]
我发现
fd现在是 1。1 用于新的文件描述符。
发生这种情况的唯一方法是关闭 fd 1。
现在 stdout 文件描述符是什么?
fileno(stdout)将为您提供fd与句柄相关的信息。
有没有办法保留 0、1、2 个文件描述符并使用 3 个文件描述符?
如果不关闭fd 0、1和2,它们将不会被重用。open使用编号最小的未使用文件描述符。
如果您希望断开 fd 0、1 或 2 的连接,请勿关闭它们。这会导致各种各样的问题。重新打开它们/dev/null即可。
或者它已关闭,我需要重新打开它?如果是,怎么办?
您可以使用dup2一个 fd 作为另一个 fd 的别名。