如何在不复制文件句柄的情况下用 C 在 linux 中生成进程

问题描述 投票:0回答:0

我想在 Linux 上运行命令行并从 C 代码捕获返回值和标准输出。我想从一些在我无法控制的大型应用程序的后台线程中运行的库代码来执行此操作。我无法对应用程序打开哪些文件和套接字、如何打开它们等做出任何假设。我也不想对生成的进程打开哪些文件以及如何打开它们(或无法关闭它们)做出任何假设.

在linux中,据我了解,fork()实际上是所有高级进程生成函数背后的底层原语,例如popen、vfork、clone、system等。(后面是spawn()的一些变体)当您在 Linux 中分叉一个进程时,文件和套接字句柄会重复,除非它们具有 FD_CLOEXEC 标志。如果我理解正确的话,这意味着在生成的进程终止之前,这些句柄将保持打开状态。

我研究了 posix_spawn()、popen()、system()、clone() 等。根据我的理解,它们似乎都复制了所有没有 FD_CLOEXEC 的文件句柄,或者有其他一些问题。如果我理解正确的话,clone()可以在进程之间共享文件表,这样句柄就不会重复——但现在我担心生成的进程文件会泄漏回调用应用程序,特别是如果生成的进程忘记了关闭其文件。这两个进程不能完全独立吗?

顺便说一句,我读过 fork() 的历史,我明白它一定感觉非常聪明,它可以在 1975 年的 Unix 中用这么少的代码行实现。但在 2023 年,必须承认“重复” “当前进程”是一个非常奇怪的基元,可以在其上构建,并且“文件句柄默认继承”也不是您在尝试设计一个易于使用而不是非常简单的 API 时所做的选择只需几行代码即可实现。

TL;DR:有没有什么方法可以以相当稳健的方式运行命令行,而不需要假设文件/套接字在任一进程中如何打开?

c linux process fork filehandle
© www.soinside.com 2019 - 2024. All rights reserved.