你如何阻止文件描述符跨fork()系统调用继承(当然没有关闭它)?
我正在寻找一种方法来将单个文件描述符标记 为不被(copy)在fork()中继承,类似于FD_CLOEXEC类似的hack但是for forks(如果你愿意,那么就是FD_DONTINHERIT功能).有人这样做过吗?或者看看这个,并提示我开始?
谢谢
更新:
__register_atfork(NULL, NULL, fdcleaner, NULL)
Run Code Online (Sandbox Code Playgroud)
在fork()返回之前关闭子中的fds.然而,fds仍然被复制,所以这对我来说听起来像是一个愚蠢的黑客.问题是如何跳过不需要的fds的孩子中的dup()
我想到了一些需要fcntl(fd,F_SETFL,F_DONTINHERIT)的场景:
fork()将复制事件fd(例如epoll); 有时这不是必需的,例如FreeBSD将kqueue()事件fd标记为KQUEUE_TYPE,并且这些类型的fds不会被复制到forks(如果有人想要,则会明确跳过kqueue fds被复制)从一个孩子使用它必须与共享fd表分叉)
fork()将复制100k不需要的fds来分叉一个孩子做一些cpu密集型任务(假设需要fork()概率非常低,程序员不希望维护一个孩子池,因为通常不会发生)
我们想要复制一些描述符(0,1,2),有些(大多数?)不是.我认为完整的fdtable重复是出于历史原因,但我可能错了.
这听起来多么愚蠢:
考虑该计划
#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() …
Run Code Online (Sandbox Code Playgroud)