有没有办法自动关闭 fork() 上的某些句柄?

2024-02-17

背景:我有一个大型的现有进程(它恰好在 AIX 上,所以基本上是 POSIX 语义),它是一个更大系统的一部分。现有流程设计为连续运行。此过程的一个新要求是处理一种新型的复杂输入流。为了降低风险,我决定分叉/执行一个子进程来执行实际的输入处理,这将现有的主进程与崩溃或因格式错误的输入数据而挂起等问题隔离开来。

子进程从stdin读取数据,处理后写入stdout。我已经设置了所有通信管道,因此我可以将输入数据从主进程传递给子进程,并以其他方式读取输出,这一切都工作正常(非阻塞以避免死锁等)。只要主进程从外部源接收(有限)输入流,子进程就存在。

我的问题是关于管柄本身的。主进程通过调用通知子进程输入流已完成close()在连接到孩子的标准输入的管道上。只要only该管道写入端的句柄由主进程持有。如果主进程由于其他一些不相关的原因决定分叉怎么办?这将创建two管道写入端的句柄,这意味着当我尝试关闭标准输入管道的写入端时,孩子不会注意到,因为还有另一个打开的写入端句柄。另一个打开的手柄是我无法控制的。

我知道有FD_CLOEXEC我可以在文件描述符上设置位,以便在文件描述符发生错误时自动关闭exec()已经完成了。但是,这并不能防止主进程分叉但不执行的情况。

这个问题的一般解决方案是什么?我只能想到几个想法:

  1. 确保(通过检查)现有进程不会在不执行 exec 的情况下任意分叉。这也许是可能的,但不是通用的解决方案。
  2. 在启动时,分叉一个长期存在的帮助程序进程,其唯一职责是定期分叉/执行执行实际处理的子进程。这样助手的句柄上下文是已知的并且可以很好地控制。然而,这很烦人,因为助手需要某种方式来知道输入流已经结束,而不是关闭its stdin.

Very few No standard system libraries fork without exec. It's quite unusual. There is no close-on-fork facility in Unix or Linux, and I doubt it on AIX. There are loadable kernel extensions on AIX if you really care that much. Presumably you know about fcntl for close on exec. If your co-workers are writing exec-less forks, then I can't offer much assistance.

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

有没有办法自动关闭 fork() 上的某些句柄? 的相关文章

  • 使用 R 过滤列并重复比较成对的两列

    Given a df如下 对于每年的实际值和预测值 我需要检查今年的实际值和预测值与上一年的实际值相比是否具有相同的方向 df lt structure list code c M0000273 M0000357 M0000545 name
  • 使用多个管道从 Python 执行 Shell 脚本

    我想在 python 脚本中执行以下 Shell 命令 dom myserver cat etc xen myserver cfg grep limited cut d f2 tr d 我有这个 dom myserver limit sub
  • 是否可以在由同一父进程创建的两个子进程之间建立管道(LINUX,POSIX)

    我有多个孩子由同一个父母 分叉 我尝试构建pipe所有这些子进程之间的连接就像一个链表结构 孩子 1 向孩子 2 发送数据 孩子 2 向孩子 3 孩子 N 向孩子 1 发送数据 有没有正确的方法可以做到这一点 此外 如果我在进程之间创建和通
  • 如何获取子进程的返回值?

    程序计算从 1 到 N 的数字之和 子进程计算偶数之和 父进程计算奇数之和 我想在父进程中获取子进程的返回值 我怎么做 include
  • 我不明白这个 fork() 的例子

    我有这个代码示例 但我不明白为什么这段代码会创建 5 个进程加上原来的进程 总共6个过程 include
  • dev_t 和 ino_t 是否必须是整数类型?

    glibc 的文档保留它们是整数类型 不比 unsigned int 窄 但我没有找到说明它们必须是整数类型的标准参考 另请参阅 time t 所以最后 问题就变成了 include
  • 无法在 Linux 中阻止从命名管道 (FIFO) 读取

    很奇怪 我似乎无法完成这项工作 这是我的架构 我有一个命名管道 它将在永远运行 root读取器进程和多个应用程序编写器进程 读者进程必须是blocking当作家们在nonblocking 因此 这就是我在阅读器进程中所做的 该进程将运行ro
  • 如果 POSIX 系统上不存在目录,是否有办法自动创建该目录?

    POSIX 系统上是否有任何方法可以仅在目录尚不存在时才自动创建该目录 如同 int fd open path to file O CREAT O EXCL O RDWR 0644 这不起作用 int dfd open path to di
  • 如何从 POSIXct 对象获取原点

    我有一个像这样的函数 foo function time in code here that changes POSIXct to numeric time out as POSIXct time in origin 1970 01 01
  • 在 Windows 上使用 PHP 进行分叉/线程的最佳方法是什么?

    我有一个 php 脚本 用于检查许多 数千个 网站上的更新 有时 随着站点数量的增加 情况会更频繁 我在更新其中一个站点时会遇到执行超时 整个脚本都会付诸东流 我能想到的最好的想法是分叉每个更新 所以如果它死了 整体更新就会继续 从我收集到
  • 子进程c的返回值

    我需要帮助将 状态代码 从子程序返回给父程序 它将检查状态代码 打印代码并退出父程序 这是一个班级项目 所以我会在这里放置一些相关代码 但出于明显的原因 我不会发布整个项目 我已经通过 exec 分叉并创建了子进程 父进程进行一些奇特的数学
  • POSIX:FreeBSD 与 Linux 中的管道系统调用

    在 Linux 2 6 35 22 generic 中 man pipe指出 pipeline 创建一个管道 一个可用于进程间通信的单向数据通道 在 FreeBSD 6 3 RELEASE p5 中 man pipe指出 pipeline
  • 更改子进程中的 iostream

    现在 我正在开发一个项目 其中我需要启动一个子进程来使用 C 在 Linux 中执行一个新程序 并且我需要重定向标准输入和输出 就像在 C 中一样 它们是cin and cout 到一个文件 这意味着在子进程中 标准输入和输出都是文件 子进
  • 为什么我的 Java 代码执行 bash 命令不正确?

    我试图让我的 Java 程序与 Linux bash 交互 但出了问题 我有一个简单的可执行文件prog从中读取一个整数stdin并输出其平方 执行中 echo 5 prog 从 bash 本身打印正确答案25 in stdout但运行 i
  • 怎样才能使 Windows 成为一个开箱即用的 POSIX 兼容操作系统?

    这个问题的动机是我的一个牵强的梦想 即 nix 平台上可用的许多优秀软件可以轻松移植到 Windows 微软最近对开源和开放性采取了不同的方法 所以我真的很想知道如果微软有这样的倾向 这样的事情会有多可行 我很好奇的一些更具体的事情是 是否
  • powershell stdin 管道和重定向

    你好 我一直在制作一个小的跨平台脚 本 我可以将其卷曲并通过管道传输到bash和Powershell中 基本思想是服务器向解释器发送一个命令 然后它给出一个命令将所有输出重定向到标准输出 bash 中的一个例子是 some commands
  • Python getstatusoutput 替换不返回完整输出

    我发现了这个很棒的替代品getstatusoutput Python 2 中的函数在 Unix 和 Windows 上同样有效 不过我觉得这个方法有问题output被构建 它只返回输出的最后一行 但我不明白为什么 任何帮助都是极好的 def
  • NPTL 和 POSIX 线程有什么区别?

    NPTL 和 POSIX 线程之间的基本区别是什么 这两者是如何演变的 POSIX 线程 pthread 不是一个实现 它是几个函数的 API 规范 纸上的标准 英文 其名称以pthread 以及定义在
  • 分叉/多线程进程|重击

    我想让我的代码的一部分更加高效 我正在考虑让它分叉成多个进程 并让它们一次执行 50 100 次 而不是只执行一次 例如 伪 for line in file do foo foo2 foo3 done 我希望这个 for 循环运行多次 我
  • fork() 是如何工作的?

    我对fork真的很陌生 这段代码中的pid在做什么 有人可以解释一下 X 行和 Y 行的结果吗 include

随机推荐

  • 发布表单时的 post 与 put

    当评估表单是否已提交时 我检查方法是否为 post 而不是 get 有人告诉我 这是一个好方法 可以了解表单是通过单击 提交 按钮提交的 而不仅仅是由在 url 中传递数据的脚本提交的 put 方法怎么样 看起来和 post 很相似 是否可
  • AngularJS $location 没有模板

    我想使用 locationProviderAngularJS 中的服务 无需在我的中渲染新的 HTML 模板ng view 我有一个div通过按需显示的元素ng show绑定到数据元素的存在 我想通过以下方式将其连接到浏览器位置 locat
  • 使用三元运算符的缺点

    我的源代码中有以下语句 int tableField1 int tableField2 int propertyField1 int propertyField2 if tableField1 null propertyField1 tab
  • 在C中将XImage写入.bmp文件

    我正在使用以下代码将 XImage 写入文件 bitmap0 bmp 但是当我在 fedora 中使用 imageViewer 打开新创建的文件时 它会给出 文件过早结束 错误并且不显示任何内容 谁能指出以下代码中的问题吗 typedef
  • Synthesia 可以很好地播放 MIDI 文件而没有任何音符关闭事件吗?

    我有一个 mid file this https pastebin com amkth128具体一个 除了标题块之外 这里是 MIDI 的相关部分 第一个轨道块仅包含元事件 并被描述为 4D 54 72 6B 00 00 00 52 Tra
  • 从公钥+私钥创建 RSAParamaters 对象

    我需要使用私钥和公钥 key 和 cer 文件 在 Net 中创建 RSAParameters 对象 是否可以在 Net 中做到这一点而不使用第三方软件 如果是这样 我应该去哪里寻找 我最终需要从该对象中提取指数 模数 D P Q DP D
  • XCode 4.3 命令行工具包校验和无效

    Apple 提供的用于使用 Xcode 4 3 安装命令行工具的软件包已损坏 我似乎需要它 因为我正在开发一些命令行工具 有没有人找到 Apple 提供的 Xcode 4 3 的替代命令行包 或者该主题的解决方法 Xcode 包含一个新的
  • 为什么指定的初始化器不能调用其基类中的辅助初始化器?

    根据文档 Objective C 中类的指定初始值设定项必须调用其基类的指定初始值设定项 另一个规则是辅助初始化器必须调用其自己类的指定初始化器 但是 如果遵循第二条规则 为什么指定的初始值设定项不能调用其基类中的辅助初始值设定项 这个基本
  • Flutter 每台设备一个帐户

    如何使一个帐户下的应用程序中只有一个用户 我使用 flutter firebase auth 电子邮件和密码 例如 我有一个帐户 只有我可以从我的设备登录 如果有人发现我的帐户 他将无法登录 谢谢你 我只是给你一个想法如何去做 在cloud
  • SecureRandom 的行为

    尽管在关注了很多文章之后SecureRandom 我在使用时遇到了疑问SecureRandomJava 中的安全 API 在下面的例子中 public class SecureRandomNumber public static void
  • Linux 命令“ll”不起作用[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我可以使用我的用户运行 ll 命令 但不能使用 sudo 它给我错误 因为找不到命令 创建别名ll alias ll ls al
  • Qt 读取访问冲突位于:0x0,flags=0x0(第一次机会)

    我有一段非常简单的代码如下 Letter Vakje geefLetter const return m letter Vakje 类使用 NULL 指针进行初始化m letter 但我仍然收到读取访问冲突错误 有人可以帮忙吗 这是调用该函
  • 如何关闭发生错误后保持打开状态的文件?

    我在用 fid fopen fgfg txt 打开一个文件 有时在我设法关闭文件之前会发生错误 在关闭 Matlab 之前我无法对该文件执行任何操作 如果发生错误 如何关闭文件 首先 你可以使用命令 fclose all 其次 你可以使用试
  • 如何使用 addObserver 闭包方法在 Swift 5 中删除Observer

    这是我的第一篇文章 我是日本 iOS 工程师 这个月刚入职 我有一个麻烦removeObserver的方法NotificationCenter在 Swift 5 中 我通过使用闭包类型将观察者添加到 ViewController VC ad
  • GPX 架构验证问题

    我正在构建一个主要使用 GPX 文件作为输入数据的应用程序 鉴于 gpx 文件应该由 gpx 模式定义 如此处定义 http www topografix com gpx asp http www topografix com gpx as
  • PHP:从哈希中解密密码

    因此 我使用以下代码成功将密码加密为密码哈希 class PassHash blowfish private static algo 2a cost parameter private static cost 10 mainly for i
  • 将 Python Pandas 中的列名称从日期时间对象更改为字符串?

    下列的这个食谱 https stackoverflow com questions 28664103 how to transform a time series pandas dataframe using the index attri
  • AngularJS 应用程序身份验证最佳实践

    我开始构建一个 Web 应用程序 用户需要进行身份验证才能访问不同的模块 我过去一直使用 ASP NET MVC 使用 FormsAuthentication 和服务器会话非常容易 因此每次访问时我不必往返数据库即可获取用户角色或任何其他用
  • gradle进程具有不同替换和重命名规则的资源

    我想在我的 gradle 项目中过滤特定的 java 资源 有些文件应该只替换内容 有些文件也应该重命名 并替换不同的内容 我的 gradle java 项目设置是 gt cat build gradle apply plugin java
  • 有没有办法自动关闭 fork() 上的某些句柄?

    背景 我有一个大型的现有进程 它恰好在 AIX 上 所以基本上是 POSIX 语义 它是一个更大系统的一部分 现有流程设计为连续运行 此过程的一个新要求是处理一种新型的复杂输入流 为了降低风险 我决定分叉 执行一个子进程来执行实际的输入处理