为什么要将 stdin、stdout 和 stderr 设置为单个 fd?

2023-11-25

我从 APUE 看到了这个代码片段

dup2(fd,0); dup2(fd,1); dup2(fd, 2); if (fd > 2) close(fd);

在我的理解中,它使 stdin、stdout 和 stderr 都指向 fd。它说很多程序都包含此代码,为什么?它有什么功能呢?


我将在此处添加评论和答案,因为即使它们是正确的,我仍然很难准确理解何时以及为何需要这一系列调用。

当进程作为守护进程运行时,通常会使用此函数调用序列。在这种情况下,守护进程不希望将标准 I/O 文件描述符附加到终端(或其他资源)。要“分离”这些描述符,可能会发生如下情况:

int fd;  

fd = open("/dev/null",O_RDWR);  // missing from APUE exercise 3.4 example

if (fd != -1)   
{     
  dup2 (fd, 0);  // stdin  
  dup2 (fd, 1);  // stdout
  dup2 (fd, 2);  // stderr

  if (fd > 2) close (fd);  
}  

这是绑定的/dev/null' to each of the standard I/O descriptors and closes the temporary descriptor used to open/dev/null` 首先(只要该打开最终没有使用通常用于标准 I/O 描述符的描述符之一)。

现在,守护进程具有有效的 stdin/stdout/stderr 描述符,但它们并不引用可能干扰另一个进程的文件或设备。

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

为什么要将 stdin、stdout 和 stderr 设置为单个 fd? 的相关文章

随机推荐

  • 如何防止 Visual Studio 设计器在 DataGridView 中自动生成列?

    我在子类中生成所有列DataGridView以编程方式 然而 Visual Studio 2008 不断读取我的构造函数类 它填充DataTable具有空内容并将其绑定到DataGridView 并为中的列生成代码InitializeCom
  • JGit 克隆存储库

    我正在尝试使用 JGit 克隆 Git 存储库 但遇到 UnsupportedCredentialItem 问题 My code FileRepositoryBuilder builder new FileRepositoryBuilder
  • 是否可以将“require”和“import”与Webpack一起使用?

    我们必须更新一些依赖项才能切换到 Webpack 4 并且在尝试混合时在 webpack 中收到警告 在浏览器中收到错误import and require在同一个项目内 我们有一个very大型项目 300 个文件 其中一些文件使用var
  • DotNetCore:GetInvalidFileNameChars 的跨平台版本?

    我正在构建一个可在 Windows 和 Ubuntu 系统上运行的 Net Core 2 0 控制台应用程序 我有一个字符串需要转换为安全的文件名 目前我正在使用以下代码来实现此目的 var safeName string Join nam
  • __func__ C++11 函数的局部预定义变量,无法编译

    The func 函数的 C 11 本地预定义变量无法在使用默认内置 Visual Studio 2012 v110 编译器或 2012 年 11 月 CTP v120 CTP Nov2012 编译器的 Visual Studio 2012
  • 将选项 [keepaspectratio=true, scale = 0.75] 添加到 Sweave 中的 \includegraphics{}

    我有以下 R 代码 lt
  • Android - 推送通知已开启?

    如何以编程方式检查用户是否在应用程序设置中关闭推送通知 我可以直接从应用程序打开应用程序设置意图来提示用户将其打开吗 Thanks 假设您指的是 Google Cloud Messaging 因为您使用的是 android 和推送通知标签
  • PHP 请求生命周期

    好吧 我对 PHP VM 的了解还比较幼稚 最近我一直在想一些事情 特别是 Web 应用程序的 PHP 请求生命周期是什么样的 我找到一篇文章here这给出了很好的解释 但我觉得有has更贴近故事 根据文章的解释 每次向服务器发出请求时都会
  • 如何在VBA中使用列/行索引作为范围

    喜欢使用Cells 1 1 代替Range A1 在 VBA 中使用列 行索引作为范围的最佳方法是什么 我想出了两种解决方案来表示 Range A A Range Cells 1 1 Cells Columns 1 Rows count 1
  • 如何解释 ELF 可执行文件中的动态符号表?

    我正在考虑解释动态符号表 dynsym 的 ELF 可执行文件 我可以成功解释符号表 symtab 每个符号 16 个字节 使用value属性来表示符号的地址和name属性表示字符串开头的偏移量 strtab部分 但我无法解释动态符号表 d
  • C#:如何从资源文件加载光标?

    我已将文件 x ani 导入到资源文件Resources resx 中 现在尝试使用 ResourceManager GetObject aero busy ani 加载该文件 Cursor Current Cursor Resources
  • ASP.Net MVC 中的线程安全

    我怀疑这也适用于一般的 ASP Net 但我不确定 如果我在控制器上有一个操作方法 比如 MyController DoSomethingExciting 并且三个客户端 同时 点击它 那么它本质上是线程安全的 还是我需要做一些事情来确保三
  • Objective C:我的自定义 -init 方法没有被调用

    我有一个从 UIView 派生的类 我想为其创建一个 init 类 如下所示 id init if self super init my initializations here return self 不幸的是 我知道 init 没有被调
  • 如何在 Apache 2.x 中使用 mod_deflate 预压缩文件?

    我通过 apache 提供所有内容Content Encoding zip但这是动态压缩的 我的大部分内容都是磁盘上的静态文件 我想预先对文件进行 gzip 压缩 而不是每次请求时都对其进行压缩 我相信 这是一件事 mod gzip在 Ap
  • 高效的Python IPC [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我正在Python3中制作一个应用程序 它将分为batch and gui部分 Batch负责处理逻辑和gui负责显示它 Which 进程间通信 I
  • 如何将微调器添加到 ActionBar?

    我试图让我的微调器作为操作栏下拉列表项工作 但我似乎根本无法实现它 在谷歌搜索后没有太多关于此的教程 我认为它与 setListNavigationCallbacks 有关行代码 我只是不知道如何从该行开始工作 setup action b
  • 倒计时器 - iPhone [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 我想显示倒计时器 我有开始日期和结束日期 我需要显示剩
  • python中大数的阶乘

    这是我的阶乘方法 def factorial n Returns factorial of n r 1 for i in range 1 n 1 r i return r 我认为这非常简单 但我猜你可以做得更有效 因为像 100000 这样
  • 为什么当Windows服务停止时调用base.OnStop()?

    我正在创建一个 C Net Windows 服务 想知道您是否总是需要调用base OnStop 在服务的OnStop 方法以及为什么 protected override void OnStop threadRunning false t
  • 为什么要将 stdin、stdout 和 stderr 设置为单个 fd?

    我从 APUE 看到了这个代码片段 dup2 fd 0 dup2 fd 1 dup2 fd 2 if fd gt 2 close fd 在我的理解中 它使 stdin stdout 和 stderr 都指向 fd 它说很多程序都包含此代码