关闭 stdout 和 stdin 文件描述符后重新打开它们

2023-11-27

我正在编写一个函数,给定一个参数,该函数会将标准输出重定向到文件或从文件读取标准输入。为此,我关闭与 stdout 或 stdin 关联的文件描述符,以便当我打开文件时,它会在我刚刚关闭的描述符下打开。这是可行的,但问题是一旦完成,我需要将标准输出和标准输入恢复到它们真正应该的样子。

我能为标准输出做的就是 open("/dev/tty",O_WRONLY);但我不确定为什么这会起作用,更重要的是我不知道 stdin 的等效语句。

所以我有,对于标准输出

close(1);
if (creat(filePath, O_RDWR) == -1)
{
    exit(1);
}

对于标准输入

close(0);
if (open(filePath, O_RDONLY) == -1)
{
    exit(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 标志(FD_CLOEXEC;请参阅 fcntl(2)) 因为重复描述符已关闭。

如果这是一个问题,您可能必须恢复 close-on-exec 标志,可能使用 dup3() 而不是 dup2() 以避免竞争条件。

另外,请注意,如果您的程序是多线程的,其他线程可能会意外写入/读取您重新映射的标准输入/标准输出。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关闭 stdout 和 stdin 文件描述符后重新打开它们 的相关文章

随机推荐

  • 解耦 Microsoft.AspNet.Identity.*

    我正在 Visual Studio 2013 RC 中工作 并使用新的测试表单身份验证Microsoft AspNet Identity 包 我想集成这些概念 用户 角色等 但想使用我自己的域模型 POCO 它们位于不同的程序集中 我也不想
  • 将项目添加到 ListView 时触发事件?

    我有这个 XAML
  • MySQL 触发器可以模拟 CHECK 约束吗? [复制]

    这个问题在这里已经有答案了 我想在MySQL中使用CHECK约束 但不支持 与其他 RDBMS 不同 它会理解但不会强制检查 我见过一些带有触发器的解决方法 但他们倾向于为相关字段设置默认值 而不是返回错误 是否可以构造一个触发器 在不满足
  • 尽管通过 FBSDKLoginButton 登录,ios Facebook SDK v4.x 访问令牌仍为空

    尽管按钮显示我已登录 但我的 Facebook 访问令牌为空 有人知道为什么会这样吗 来自 RootViewController m void viewDidLoad super viewDidLoad self gt login butt
  • 浏览器显示比原始尺寸更大的图像

    我的网站显示的图像大于其原始尺寸 这些图像比用 Photoshop 创建的原始图像大 20 例如 如果图像的宽度为 200 像素 则浏览器显示为 240 像素 所以我所有的图像都变得模糊了 你知道为什么吗 我找到了解决方案 Windows
  • sql搜索查询多个可选参数

    我正在尝试为我的文档归档系统上的高级搜索页面编写查询 我正在尝试通过多个可选参数进行搜索 我有大约 5 个参数 它们可以是空字符串或搜索字符串 我知道我不必将每个检查为字符串或空 并为每个组合创建单独的存储过程 编辑 最终使用 ISNULL
  • 强制在 C# 中实现通用接口

    无论如何 是否有强制通用定义的约束来实现 通用接口 也就是说 我希望该类支持传递接口和约束它的通用类 以便该类实现该接口 例如 如果我说 MyGenericClass
  • PHP限制文本字符串不包括html标签?

    这是对我不起作用的 我想将可见文本限制为 100 个字符 但使用substr 还包括限制中的不可见文本 a href http www a
  • Neo4j 中的基元计数

    我一直在阅读文档 for neo4j这是成分并且还没有遇到让我查询图中基元 节点 关系和属性 总数的功能 这个功能是否存在于某处 或者我是否必须编写遍历整个图表并进行计数的代码 谢谢你的提问 我是 Neo4j 团队的成员 我们目前拥有报告此
  • Spring Security在发送授权标头时允许所有拒绝访问

    我的安全配置如下 http authorizeRequests antMatchers authenticate fullyAuthenticated anyRequest permitAll and httpBasic 它可以工作并且所有
  • Rails:.m4v 文件的 MIME 类型问题

    在我的 Rails 应用程序中 我尝试获取文件的 MIME 类型 如下所示 MIME Types type for example m4v to s 但它不认识它 我尝试添加以下内容config initializers mime type
  • PyQt 4.7 - 在 Windows 上安装后出现导入错误

    我一直在尝试安装PyQt 4 7在 Vista 上 但当我尝试执行以下操作时遇到导入错误 from PyQt4 import QtCore QtGui ImportError DLL 加载失败 找不到指定的模块 我检查了我的系统路径 并且C
  • “实例 <服务器位于 0x2298c...> 未持久化”

    全新安装 postgreSQL15 后 看起来好像安装正确 因为我可以通过 psql 很好地访问服务器 但是 当我尝试通过 pgAdmin4 访问它时 它不会自动检测服务器 因此 我尝试通过 注册 服务器 对话框手动添加服务器 但随后提示我
  • 32 位处理器真的可以寻址 2^32 个内存位置吗?

    我觉得这可能是一个奇怪 愚蠢的问题 但这里是 在问题中C 中的 NULL 是否需要 定义为零 已经确定NULL指针指向不可寻址的内存位置 而且NULL is 0 现在 据说 32 位处理器可以寻址2 32记忆位置 2 32只是可以使用以下方
  • Java keyTool - 将主要/辅助中间证书附加到密钥存储[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我已经创建了一个密钥库 图中的 server jks 并导入了相关密钥对 keytool importkeystore srckeystore server p12 destkeys
  • 使用数据映射器模式,实体(域对象)是否应该了解映射器?

    我是第一次使用 Doctrine2 但我认为这个问题足够通用 不依赖于特定的 ORM 数据映射器模式中的实体是否应该意识到 以及use 地图绘制者 我有一些具体的例子 但它们似乎都可以归结为同一个普遍问题 如果我正在处理来自外部源的数据 例
  • 使用 processBuilder 执行 shell 命令并与其交互

    我正在尝试创建一个程序 允许我通过带有参数的终端 如果您想知道 则为树莓派的 OmxPlayer 执行命令 但我希望在启动后能够与它进行交互命令 例如我想做 omxplayer win x1 y1 x2 y2 然后可以按 p 暂停视频 音频
  • 如何只制作注册邀请函?

    使用 Meteor 帐户 以及accounts ui 有没有一种简单的方法可以只邀请新用户注册 例如 通过提供邀请链接或邀请码 我在 Meteor 文档中能找到的唯一相关内容是Meteor sendEnrollmentEmail但这并不能解
  • 如何通过连接表填充 has_many 中的字段

    我有一个关于活动记录关联的问题 参考 Rails 文档的这一部分 http guides rubyonrails org association basics html the has many through association 如果
  • 关闭 stdout 和 stdin 文件描述符后重新打开它们

    我正在编写一个函数 给定一个参数 该函数会将标准输出重定向到文件或从文件读取标准输入 为此 我关闭与 stdout 或 stdin 关联的文件描述符 以便当我打开文件时 它会在我刚刚关闭的描述符下打开 这是可行的 但问题是一旦完成 我需要将