在 Linux fork 期间防止文件描述符继承

2024-01-03

如何防止文件描述符被复制继承fork()系统调用(当然不关闭它)?

我正在寻找一种标记方法单个文件描述符 as 不被(复制)继承由孩子们在fork(),类似 FD_CLOEXEC 之类的 hack,但适用于 fork(如果您愿意,可以使用 FD_DONTINHERIT 功能)。有人做过这个吗?或者调查一下这个并给我一个开始的提示?

谢谢

UPDATE:

我可以用libc 的 __register_atfork http://refspecs.freestandards.org/LSB_3.1.1/LSB-Core-generic/LSB-Core-generic/baselib--register-atfork.html

 __register_atfork(NULL, NULL, fdcleaner, NULL)

之前关闭子进程中的 fdsfork()返回。然而,FD 仍在被复制,所以这对我来说听起来像是一个愚蠢的黑客行为。问题是如何跳过dup()- 生成不需要的 FD 的子代。

我正在考虑一些场景fcntl(fd, F_SETFL, F_DONTINHERIT)需要:

  • fork()将复制事件 FD(例如epoll());有时这是不需要的,例如 FreeBSD 将 kqueue() 事件 FD 标记为 KQUEUE_TYPE,并且这些类型的 FD 不会跨分支复制(如果想要的话,kqueue FD 会显式地跳过复制)从子级使用它,它必须与共享 FD 表分叉)

  • fork()将复制 100k 不需要的 FD 来分叉一个子进程来执行一些 CPU 密集型任务(假设需要fork()概率非常低,程序员不会想为通常不会发生的事情维护一个子池)

有些描述符我们想要被复制(0,1,2),有些(大多数?)不需要。我认为完整的 FD 表复制是出于历史原因,但我可能是错的。

这听起来多么愚蠢:

  • patch fcntl()支持不继承文件描述符上的标志(不确定该标志是否应保留在每个 FD 中或保留在 FD 表 fd_set 中,就像保留 close-on-exec 标志一样
  • modify dup_fd()在内核中跳过复制不继承FD,与 FreeBSD 对 kq FD 的处理相同

考虑该计划

#include <stdio.h>
#include <unistd.h>
#include <err.h>
#include <stdlib.h>
#include <fcntl.h>
#include <time.h>

static int fds[NUMFDS];
clock_t t1;

static void cleanup(int i)
{
    while(i-- >= 0) close(fds[i]);
}
void clk_start(void)
{
    t1 = clock();
}
void clk_end(void)
{  

    double tix = (double)clock() - t1;
    double sex = tix/CLOCKS_PER_SEC;
    printf("fork_cost(%d fds)=%fticks(%f seconds)\n",
        NUMFDS,tix,sex);
}
int main(int argc, char **argv)
{
    pid_t pid;
    int i;
    __register_atfork(clk_start,clk_end,NULL,NULL);
    for (i = 0; i < NUMFDS; i++) {
        fds[i] = open("/dev/null",O_RDONLY);
        if (fds[i] == -1) {
            cleanup(i);
            errx(EXIT_FAILURE,"open_fds:");
        }
    }
    t1 = clock();
    pid = fork();
    if (pid < 0) {
        errx(EXIT_FAILURE,"fork:");
    }
    if (pid == 0) {
        cleanup(NUMFDS);
        exit(0);
    } else {
        wait(&i);
        cleanup(NUMFDS);
    }
    exit(0);
    return 0;
}

当然,不能认为这是一个真正的长凳,但无论如何:

root@pinkpony:/home/cia/dev/kqueue# time ./forkit
fork_cost(100 fds)=0.000000ticks(0.000000 seconds)

real    0m0.004s
user    0m0.000s
sys     0m0.000s
root@pinkpony:/home/cia/dev/kqueue# gcc -DNUMFDS=100000 -o forkit forkit.c
root@pinkpony:/home/cia/dev/kqueue# time ./forkit
fork_cost(100000 fds)=10000.000000ticks(0.010000 seconds)

real    0m0.287s
user    0m0.010s
sys     0m0.240s
root@pinkpony:/home/cia/dev/kqueue# gcc -DNUMFDS=100 -o forkit forkit.c
root@pinkpony:/home/cia/dev/kqueue# time ./forkit
fork_cost(100 fds)=0.000000ticks(0.000000 seconds)

real    0m0.004s
user    0m0.000s
sys     0m0.000s

forkit 在 Dell Inspiron 1520 Intel(R) Core(TM)2 Duo CPU T7500 @ 2.20GHz 和 4GB RAM 上运行;平均负载=0.00


If you fork目的是调用exec功能,你可以使用fcntl with FD_CLOEXEC一旦你关闭文件描述符exec:

int fd = open(...);
fcntl(fd, F_SETFD, FD_CLOEXEC);

这样的文件描述符将继续存在fork但不是功能exec family.

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

在 Linux fork 期间防止文件描述符继承 的相关文章

  • 跟踪 Linux 程序中活跃使用的内存

    我想跟踪各种程序在特定状态下接触了多少内存 例如 假设我有一个图形程序 最小化时 它可能会使用更少的内存 因为它不会重新绘制窗口 这需要读取图像和字体并执行大量库函数 这些对象仍然可以在内存中访问 但实际上并没有被使用 类似的工具top它们
  • Jenkins中找不到环境变量

    我想在詹金斯中设置很多变量 我试过把它们放进去 bashrc bash profile and profile of the jenkins用户 但 Jenkins 在构建发生时找不到它们 唯一有效的方法是将所有环境变量放入Jenkinsf
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 为什么 Linux perf 使用事件 l1d.replacement 来处理 x86 上的“L1 dcache misses”?

    在英特尔 x86 上 Linux用途 https stackoverflow com a 52172985 149138事件l1d replacements来实施其L1 dcache load misses event 该事件定义如下 计数
  • 我可以从命令行打印 html 文件(带有图像、css)吗?

    我想从脚本中打印带有图像的样式化 html 页面 谁能建议一个开源解决方案 我使用的是 Linux Ubuntu 8 04 但也对其他操作系统的解决方案感兴趣 你可以给html2ps http user it uu se jan html2
  • 从 Python 调用 PARI/GP

    我想打电话PARI GP http pari math u bordeaux fr dochtml gpman html仅从Python计算函数nextprime n 对于不同的n是我定义的 不幸的是我无法得到帕里蟒蛇 http code
  • 域套接字“sendto”遇到“errno 111,连接被拒绝”

    我正在使用域套接字从另一个进程获取值 就像 A 从 B 获取值一样 它可以运行几个月 但最近 A 向 B 发送消息时偶尔会失败 出现 errno 111 连接被拒绝 我检查了B域套接字绑定文件 它是存在的 我也在另一台机器上做了一些测试 效
  • 加载数据infile,Windows和Linux的区别

    我有一个需要导入到 MySQL 表的文件 这是我的命令 LOAD DATA LOCAL INFILE C test csv INTO TABLE logs fields terminated by LINES terminated BY n
  • Discord.net 无法在 Linux 上运行

    我正在尝试让在 Linux VPS 上运行的 Discord net 中编码的不和谐机器人 我通过单声道运行 但我不断收到此错误 Unhandled Exception System Exception Connection lost at
  • Linux 内核标识符中前导和尾随下划线的含义是什么?

    我不断遇到一些小约定 比如 KERNEL Are the 在这种情况下 是内核开发人员使用的命名约定 还是以这种方式命名宏的语法特定原因 整个代码中有很多这样的例子 例如 某些函数和变量以 甚至 这有什么具体原因吗 它似乎被广泛使用 我只需
  • os.Mkdir 和 os.MkdirAll 权限

    我正在尝试在程序开始时创建一个日志文件 我需要检查是否 log如果不创建目录 则目录存在 然后继续创建日志文件 好吧 我尝试使用os Mkdir 也os MkdirAll 但无论我在第二个参数中输入什么值 我都会得到一个没有权限的锁定文件夹
  • Linux 可执行文件与 OS X“兼容”吗?

    如果您在基于 Linux 的平台上用 C 语言编译一个程序 然后将其移植以使用 MacOS 库 它会工作吗 来自编译器的核心机器代码在 Mac 和 Linux 上兼容吗 我问这个问题的原因是因为两者都是 基于 UNIX 的 所以我认为这是真
  • iptables通过注释删除特定规则

    我需要删除一些具有相同评论的规则 例如 我有带有 comment test it 的规则 所以我可以像这样获得它们的列表 sudo iptables t nat L grep test it 但是我怎样才能删除所有带有注释 测试它 的 PR
  • Linux 中什么处理 ping?

    我想覆盖 更改 linux 处理 ping icmp echo 请求数据包的方式 这意味着我想运行自己的服务器来回复传入的 icmp 回显请求或其他 数据包 但为了使其正常工作 我想我需要禁用 Linux 的默认 ping icmp 数据包
  • ubuntu:升级软件(cmake)-版本消歧(本地编译)[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我的机器上安装了 cmake 2 8 0 来自 ubuntu 软件包 二进制文件放置在 usr bin cmake 中 我需要将 cmake 版本至少
  • 如何通过保持目录结构完整来同步路径中匹配模式的文件?

    我想将所有文件从服务器 A 复制到服务器 B 这些文件在不同级别的文件系统层次结构中具有相同的父目录名称 例如 var lib data sub1 sub2 commonname filetobecopied foo var lib dat
  • PHP 无法打开流:是一个目录

    非常简单的 PHP 脚本 我在我亲自设置的 Ubuntu Web 服务器上的 EE 模板中运行 我知道这与权限有关 并且我已经将我尝试写入的目录的所有者更改为 Apache 用户 我得到的错误是 遇到 PHP 错误 严重性 警告 消息 fi
  • SSE:跨页边界的未对齐加载和存储

    我在页面边界旁边执行未对齐加载或存储之前读过某处 例如使用 mm loadu si128 mm storeu si128内在函数 代码应首先检查整个向量 在本例中为 16 个字节 是否属于同一页 如果不属于同一页 则切换到非向量指令 我知道
  • 将 jar 作为 Linux 服务运行 - init.d 脚本在启动应用程序时卡住

    我目前正在致力于在 Linux VM 上实现一个可运行的 jar 作为后台服务 我已经使用了找到的例子here https gist github com shirish4you 5089019作为工作的基础 并将 start 方法修改为
  • 在我的 index.php 中加载 CSS 和 JS 等资源时出现错误 403

    我使用的是 Linux Elementary OS 并在 opt 中安装了 lampp My CSS and JS won t load When I inspect my page through browser The console

随机推荐

  • 你能推荐一些关于 Linux 上的 Epoll 的指南吗?

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我需要了解 Linux 系统上的 Epoll 您能推荐有关 epoll 库的手册或指南吗 需要更详细的指南 最好有一些例子 帮我 感谢您的
  • 仅在 Jenkins(和/或 Hudson)上检查已更改文件的 Checkstyle 和 Findbugs

    我们使用大量遗留代码 并考虑为新代码引入一些指标 是否可以让 Findbugs 和 Checkstyle 仅在更改的文件而不是完整的项目上运行 最好确保只签入最低质量的文件 但代码库本身 尚未 尚未被触及和评估 以免人们因数千个问题而感到困
  • 2 PDF 上 R Markdown 中的徽标

    我使用下面的代码在 pdf 版本的 r markdown 中添加公司徽标输出很好 我需要在每一页上添加 2 个徽标 一个用于我的客户 另一个用于我们的公司 可以使用 r markdown 在 pdf 中添加 2 个徽标 title Comp
  • 是否可以在函数体中获取函数名? [复制]

    这个问题在这里已经有答案了 在BASH中 是否可以在函数体中获取函数名称 以下面的代码为例 我想在其正文中打印函数名称 Test 但 0 似乎指的是脚本名称而不是函数名称 那么如何获取函数名呢 bin bash function Test
  • 在 Shell 中连接两个包含不匹配行的文件

    文件1 log 207 46 13 90 37556 157 55 39 51 34268 40 77 167 109 21824 157 55 39 253 19683 文件2 log 207 46 13 90 62343 157 55
  • 如何为图像编写良好的替代文本,以帮助屏幕阅读器和盲人用户理解图片的内容?

    如何为图像编写良好的替代文本 以帮助屏幕阅读器和盲人用户理解图片的内容 如果我们使用 Alt 文本 那么如果我们在菜单图像等特殊情况下使用两者 则 Title text 中应该包含什么内容 我是一名屏幕阅读器用户 并将使用 Stack Ov
  • 带有codeigniter框架的php

    function invitation result this gt load gt database user id GET user id qry mysql query select from sent invitations whe
  • 裁剪、调整大小和缩放图像之间有什么区别?

    我正在使用 Perl 的Image Imlib2 https metacpan org pod Image Imlib2包从较大的图像生成缩略图 我之前曾使用多个 ImageMagick 接口 PHP Ruby Python 完成过此类任务
  • 添加权利文件时,权利无效 0xE8008016

    我正在尝试进行临时分发 当我使用 XCode 时 该应用程序在我的手机上安装得很好 为了准备临时分发 我创建了默认权利文件 取消选中 get task allow 框 将权利文件名添加到代码签名权利行 并尝试在我的手机上安装 如果我在构建设
  • 如何在Interface Builder中实现视觉效果视图?

    如何在 Interface Builder 中使用具有模糊和活力的视觉效果视图 我已将此项目拖到视图中 然后拖动UILabel到层次结构中的最后一个视图 充满活力的效果contentView我假设 这会导致顶部视图模糊 但没有可见的标签 我
  • 如何使用 CakePHP 模型中的电子邮件组件?

    我有一个非常简单的模型 我想将发送电子邮件例程添加到模型的方法之一 this gt Email gt delivery smtp this gt Email gt template default this gt Email gt send
  • 初始化忽略构造函数模板

    在追查一些错误时 我偶然发现了以下初始化行为 这对我来说似乎很奇怪 在对现有构造函数进行初始化检查时 似乎存在忽略拟合构造函数的模板的情况 例如 考虑以下程序 include
  • 笑话 - 有没有办法检查测试覆盖率的百分比?

    我使用以下命令来运行测试并获取覆盖率报告 jest coverage 现在我想检查我的脚本文件中的覆盖率是否超过 90 我应该怎么办 您可以使用coverageThresholdJest 配置中的选项 https jestjs io doc
  • 如何禁用 Highcharts 中的悬停颜色更改?

    我正在为我的项目使用柱形图 我编写了一个自定义函数 根据 y 值对图表的每个条形进行着色 当我初始化图表时 这工作得很好 当我将鼠标悬停在图表上时 条形的颜色将恢复为默认值 而我的自定义颜色永远不会返回 我尝试过禁用悬停 但这似乎不起作用
  • 从ear/lib/jar 中的ear/war 获取类返回ClassNotFoundException

    我的项目结构如下 服务器是 Glassfish 4 IDE netbeans 7 4 项目 temp 由项目 a 使用 EAR lib temp jar a war Temp jar包含核心类 它们被战争所利用 Temp jar不会从 wa
  • 权限被拒绝(公钥)。致命:远程端在推回到 git 存储库时意外挂起[重复]

    这个问题在这里已经有答案了 可能的重复 github 新手问题 gt 权限被拒绝 公钥 fatal 远端意外挂断 https stackoverflow com questions 3617113 github newbie problem
  • MYSQL PHP - 获取 float LIKE $float

    我想要像我这样的带有浮点数的行 float 我使用了这段代码 float GET float requst mysql fetch array mysql query SELECT FROM floats WHERE float LIKE
  • 如何添加透视监听器

    在我们的应用程序中 我们有 4 个视图 视图 1 2 3 和 4 和 3 个视角 视角 1 2 和 3 观点是通过实施来建立的IPerspectivefactory视图是通过扩展viewPart来构建的 我们面临着这样一种情况 在选择任何视
  • 如何从我的iPhone App文档目录中选择所有图像

    我有一个包含一堆图像的文件夹 我想将所有图像的名称添加到一个数组中 这些图像位于应用程序上我的文档的文件夹中 请参阅屏幕截图 我知道如果我想获得这些图像之一 我会使用以下代码 NSArray paths NSSearchPathForDir
  • 在 Linux fork 期间防止文件描述符继承

    如何防止文件描述符被复制继承fork 系统调用 当然不关闭它 我正在寻找一种标记方法单个文件描述符 as 不被 复制 继承由孩子们在fork 类似 FD CLOEXEC 之类的 hack 但适用于 fork 如果您愿意 可以使用 FD DO