流 dup2 更改的末尾是什么?

What end of stream dup2 change?

dub2 ( ) 更改流的哪一端是 OS 连接到的一端还是连接到应用程序的一端。

int main(){
    FILE* file = fopen("test.txt", "w");    // Create file dexcriptor
    int num = fileno(file);       // Convert FILE* to file descriptor
    dup2(num, STDOUT_FILENO);      // Make STDOUT_FILENO an alias to num
    cout << "happy year";
    close(num);
}

此代码将输出重定向到文件而不是屏幕,这意味着流的输入端现在已正确连接到文件。

dup2() 之前,进程的文件描述符 table 看起来像这样:

0 => terminal (stdin)
1 => terminal (stdout)
2 => terminal (stderr)
...
num => file "test.txt"

dup2()之后是这样的:

0 => terminal (stdin)
1 => file "test.txt"
2 => terminal (stderr)
...
num => file "test.txt"

实际上还有一个额外的间接级别。内核中有一个文件table用于所有打开的流,而test.txt的共享打开只有一个条目。两个描述符都指向该文件 table 条目——这是允许它们共享文件位置的原因。

在 C++ I/O 子系统中,cout 连接到 STDOUT_FILENO,因此重定向描述符会更改写入 cout 的位置。