流 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
的位置。
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
的位置。