在Linux fork期间阻止文件描述符继承
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在Linux fork期间阻止文件描述符继承,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2803字,纯文字阅读大概需要5分钟。
内容图文
![在Linux fork期间阻止文件描述符继承](/upload/InfoBanner/zyjiaocheng/952/9ebf97ed06e14285996f2dc4d1772294.jpg)
你如何阻止文件描述符跨fork()系统调用继承(当然没有关闭它)?
我正在寻找一种方法将单个文件描述符标记为不是
(copy-)由孩子们在fork()中继承,类似于FD_CLOEXEC之类的hack,但是对于forks(如果你愿意,那么就是FD_DONTINHERIT功能).
有人这样做过吗?或者看看这个,并提示我开始?
谢谢
更新:
__register_atfork(NULL, NULL, fdcleaner, NULL)
在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重复是出于历史原因,但我可能错了.
这听起来多么愚蠢:
>修补fcntl以支持文件描述符上的dontinherit标志(不确定标志是应该保持per-fd还是保存在fdtable fd_set中,就像保持close-on-exec标志一样
>修改内核中的dup_fd()以跳过dontinherit fds的复制,就像freebsd对kq fds一样
考虑该计划
#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内存; average_load = 0.00
解决方法:
不.自己关闭它们,因为你知道哪些需要关闭.
内容总结
以上是互联网集市为您收集整理的在Linux fork期间阻止文件描述符继承全部内容,希望文章能够帮你解决在Linux fork期间阻止文件描述符继承所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。