关闭 stdout 和 stdin 文件描述符后重新打开它们
- 2024-10-23 08:47:00
- admin 原创
- 68
问题描述:
我正在编写一个函数,给定一个参数,它将把 stdout 重定向到文件或从文件中读取 stdin。为此,我关闭了与 stdout 或 stdin 关联的文件描述符,这样当我打开文件时,它会在我刚刚关闭的描述符下打开。这有效,但问题是,一旦完成,我需要将 stdout 和 stdin 恢复到它们实际应该的状态。
我可以为 stdout 做什么,open("/dev/tty",O_WRONLY);
但我不确定为什么这样做有效,更重要的是,我不知道 stdin 的等效语句。
所以我有,对于 stdout
close(1);
if (creat(filePath, O_RDWR) == -1)
{
exit(1);
}
对于标准输入
close(0);
if (open(filePath, O_RDONLY) == -1)
{
exit(1);
}
解决方案 1:
您应该使用 dup() 和 dup2() 来克隆文件描述符。
int stdin_copy = dup(0);
int stdout_copy = dup(1);
close(0);
close(1);
int file1 = open(...);
int file2 = open(...);
< do your work. file1 and file2 must be 0 and 1, because open always returns lowest unused fd >
close(file1);
close(file2);
dup2(stdin_copy, 0);
dup2(stdout_copy, 1);
close(stdin_copy);
close(stdout_copy);
但是,你可能需要注意一些小细节(来自 man dup):
两个描述符不共享文件描述符标志(close-on-exec 标志)。重复描述符的 close-on-exec 标志(FD_CLOEXEC;参见 fcntl(2))已关闭。
如果这是一个问题,您可能必须恢复 close-on-exec 标志,可能使用 dup3() 而不是 dup2() 来避免竞争条件。
此外,请注意,如果您的程序是多线程的,其他线程可能会意外地写入/读取重新映射的 stdin/stdout。
解决方案 2:
我认为您可以在重定向之前“保存”描述符:
int save_in, save_out;
save_in = dup(STDIN_FILENO);
save_out = dup(STDOUT_FILENO);
稍后您可以使用dup2
它们来恢复:
/* Time passes, STDIN_FILENO isn't what it used to be. */
dup2(save_in, STDIN_FILENO);
我没有在该示例中进行任何错误检查 - 你应该这样做。
解决方案 3:
您可以创建一个子进程,并仅在子进程内设置重定向。然后等待子进程终止,并继续在父进程中工作。这样,您就不必担心逆转重定向了。
只需查找使用 fork() 和 wait() 的代码示例。
相关推荐
热门文章
项目管理软件有哪些?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件
热门标签
云禅道AD