doc*_*pus 5 c io file-descriptor
我觉得这是一个我认为理所当然的话题。在过去,我实际上只是关闭了许多文件描述符,“因为我被告知要这样做”。大多数情况下这是有效的,但偶尔我会遇到一些不可预测的行为。
因此,我想问 - 调用 dup / dup2 后关闭文件描述符的规则是什么?
假设我想表演cat < in > out。
fd[IN] = open("in", O_RDONLY);
saved_stdin = dup(STDIN_FILENO);
dup2(fd[IN], STDIN_FILENO);
close(fd[IN])
fd[OUT] = open("out", O_WRONLY | O_CREAT | O_TRUNC, 0644);
saved_stdout = dup(STDOUT_FILENO);
dup2(fd[OUT], STDOUT_FILENO);
close(fd[OUT])
// Later on when I want to restore stdin and stdout
dup2(saved_stdin, STDIN_FILENO);
close(saved_stdin);
dup2(saved_stdout, STDINOUT_FILENO);
close(saved_stdout);
Run Code Online (Sandbox Code Playgroud)
这是正确的还是我应该关闭更多的文件描述符?
规则确实很简单。对于这两种dup()变体,确实是:
源 fd 保持打开状态,一旦不再需要就必须关闭。
目标文件描述符,
dup(), 始终是未使用的dup2(), 被隐式关闭并被源 fd 的副本替换。当不再需要新的目标 fd 时,必须将其关闭。
源fd是指要复制的文件描述符,而目标fd是新的文件描述符。
int new_fd = dup(source_fd);
dup2(source_fd, new_fd);
Run Code Online (Sandbox Code Playgroud)
所以是的,您的代码会执行必要的关闭操作,而不会执行不需要的操作。