获取 stdout c 的文件描述符

H.L*_*.Li 1 c shell

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。

ike*_*ami 5

[撰写此答案时问题中没有代码。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 的别名。