c - 调用 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);
这是正确的还是我应该关闭更多的文件描述符?
解决方案
规则确实很简单。对于这两种dup()
变体,确实如此:
源 fd 保持打开状态,一旦不再需要就必须关闭。
目标文件描述符,
- 使用时
dup()
,始终是未使用的 - 使用时
dup2()
,隐式关闭并替换为源 fd 的副本。
- 使用时
当不再需要新的目标 fd 时,必须关闭它。
源 fd 指的是要复制的文件描述符,而目标 fd 是新的文件描述符。
int new_fd = dup(source_fd);
dup2(source_fd, new_fd);
所以是的,您的代码会执行必要的关闭,而不是不需要的。
推荐阅读
- material-ui - 有什么方法可以将图像导入到我的 materialui-nextjs 项目中
- python-3.x - 如何使用 boto3 从 dynamodb 获取最后插入的项目?
- javascript - Light Gallery 未启动
- qt - 单例模式语法错误静态字段未命名非静态数据成员或基类
- html - 在图像旁边放置一个浮动 div
- python - A 类:、A 类(对象):或 A()类:
- python - Python Regex - 如何用相同的字符替换匹配中的每个字符(无功能)
- uipath - 选择器仅在 Internet Explorer 中打开网页时起作用
- laravel - Laravel Fortify 注销重定向
- migrate - 在 .Net 5 中添加对 netNamedPipeBinding 的引用