我觉得这是一个我曾经视为理所当然的话题。过去,我只是“因为被告知”关闭了尽可能多的文件描述符。大多数时候这都有效,但偶尔会遇到一些不可预测的行为。
因此,我想问 - 在调用dup / dup2后关闭文件描述符的规则是什么?
假设我想执行
这是否正确,或者我应该关闭更多的文件描述符?
因此,我想问 - 在调用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);
这是否正确,或者我应该关闭更多的文件描述符?
saved_stdin = dup(STDIN_FILENO)
。如果我没错的话,这既不关闭saved_stdin
也不关闭STDIN_FILENO
,我是对的吗? - doctopusdup2()
关闭了先前的 stdin 并将其替换为 fd[IN]。这完全没有问题。 - Ctxsaved_stdin = dup(STDIN_FILENO)
然后跟着是dup2(fd[IN], STDIN_FILENO)
。现在 STDIN_FILENO 指向fd[IN]
。那么如果你再次调用saved_stdin = dup(STDIN_FILENO)
,这不会将原始的STDIN_FILENO
存储在saved_stdin
中替换为fd[IN]
吗?我感觉自己在过度思考或者什么的。 - doctopus