小编use*_*419的帖子

linux fork:防止文件描述符继承

你如何阻止文件描述符跨fork()系统调用继承(当然没有关闭它)?

我正在寻找一种方法来将单个文件描述符标记 为不被(copy)在fork()中继承,类似于FD_CLOEXEC类似的hack但是for forks(如果你愿意,那么就是FD_DONTINHERIT功能).有人这样做过吗?或者看看这个,并提示我开始?

谢谢

更新:

我可以使用libc的__register_atfork

 __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重复是出于历史原因,但我可能错了.

这听起来多么愚蠢:

  • 修补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() …
Run Code Online (Sandbox Code Playgroud)

linux fork

24
推荐指数
3
解决办法
2万
查看次数

Python中的空元组是否有任何用途?

还有其他目的(除了那里因为它需要)空元组可能有吗?或者:你会用什么空元组?如果有什么.我只是找不到答案(好吧,一个肯定的答案,如:"是的,有"),请帮助我解决这个问题."用于测试另一个元组是否为空"不是一个可接受的答案,因为我们应该使用'not'运算符.

python

20
推荐指数
2
解决办法
1万
查看次数

EV ssl证书绿色栏没有显示铬版本43但版本44有它

我遇到了Comodo发布的EV ssl证书的奇怪问题.基本上,绿色条通知用户连接使用EV证书加密,在IE,FF和Chromium版本44中显示正常,但Chromium 43显示没有绿色条(仅绿色锁).我不知道其他铬版本的这个问题,还没有打扰测试.

Chromium git日志显示没有可能与此问题的修复相关的信息,也没有谷歌搜索,这让我觉得它可能是我的服务器配置的本地问题.这很奇怪,所有在线SSL测试人员都给我一个A +等级和所有其他浏览器工作(甚至铬本身44+).

当然,我们有很多访客使用Chromium 43.0.XXX浏览器.

有人遇到过这个问题吗?任何人都可以给我一个暗示,至少如何追溯它的起源?
也许找到一个包含所有chrome二进制文件的存储库并逐个开始测试,找到问题出现/消失的版本并挖掘源代码更改?这样的回购甚至存在吗?因为我真的不想一个接一个地开始构建所有版本.

注意:如果我按照这张票的说明,filehippo会将我重定向到一些谷歌下载页面,我唯一的选择是获取当前的稳定,要么我不知道如何使用filehippo或者那个东西坏了.

注意:如果我测试任何browserstack说它是版本43,绿色条显示.假设我信任browserstack,可能是绿色条问题已经在43的后续转速中得到修复.

google-chrome ssl-certificate

12
推荐指数
1
解决办法
1341
查看次数

重新审视"你如何一起使用aio和epoll"

如何在单个事件循环中一起使用AIO和epoll的讨论之后.

实际上Linux中有2个"aio"API.有一个POSIX aio(aio_*系列函数),包含在glibc和libaio开发中我相信RedHat(?),io_*系列.

第一个允许通过aio_sigevent aiocb成员注册通知请求.这可以很容易地与ppoll()/ pselect()事件循环集成.如果你想将POSIX aio与epoll()集成,那么你需要将信号转换为虚拟fd(管道可能)上的事件并用epoll监听它,同时以经典方式或使用ppoll /捕获信号选择.第一选择(正常的sighandlers)的安全性取决于应用.也许在epoll上,但我并不完全了解它的内部结构.我可以安全地假设,如果我有一个基于epoll的应用程序,并且我想添加POSIX aio支持,那么我搞砸了?这是我的问题.

第二个AIO实现libaio - 可以与eventfd()一起使用(struct iocb具有aio_resfd成员,该成员预期为零或者eventfd用于提供AIO结果).但这不是书.指定POSIX,即.

我梦想自己是一个*BSD用户,一切都很清楚.您对AIO事件有POSIX AIO和kqueue()支持.晶莹剔透.像许多其他的东西.

posix epoll aio kqueue

11
推荐指数
1
解决办法
2568
查看次数

通过Windows上的ctypes将文件描述符传递给C库函数

我试图通过ctypes将文件描述符传递给C函数,在C函数中对fd执行写操作.在linux上它可以工作.在Windows上它没有,我不明白为什么(我没有在Windows上作为开发人员的经验)

//C func signature: 
void fun(struct bah *opaque, int fd)
Run Code Online (Sandbox Code Playgroud)

从python(细节ommited):

mylib.fun.argtypes = [POINTER(bah), c_int]
fh = open(filename,'wb')
#doesn't work on windows, works on linux/unix
mylib.fun(some_ctypes_struct, fh.fileno())
#doesn't work on windows
mylib.fun(bah_struct, ctypes.cdll.msvcrt._open(filename,_O_FLAGS_MASK, ACCMASK)
#doesn't work
mylib.fun(bah_struct, os.open(...))
Run Code Online (Sandbox Code Playgroud)

程序在write()s上死亡,失败的断言_osfile(fh)&FOPEN

cl.exe:16.00.40219.01 for x86 python 2.7.2 msc v.1500 32bit

我该怎么办呢?不,我不想将open()卸载到lib.我想以安全的方式传递已打开的文件描述符,与平台无关.


附加信息,以防万一:库是tinycdb,我将它快速移植到具有短cmake规范的窗口和几个脏补丁,以使getopt和dll导出工作.库和exe工具按预期工作(测试).tinycdb的python ctypes包装器可以按预期在linux上运行.窗户给了我眼球.他不会接受fd是一个有效的描述符,即使我在用自己的(msvcrt)_open libcall打开它之后传递它.


当然,如果我打开()/关闭()文件库中的文件但是我无法更改API,一切都有效.

python windows ctypes file-descriptor

6
推荐指数
1
解决办法
1571
查看次数