我有一个特殊的用例,在 linux 上使用 uinput http://thiemonge.org/getting-started-with-uinput ,创建虚拟输入设备的进程,如果默认情况下死亡,则释放所有打开的文件描述符。
在这种情况下,它还会释放创建的虚拟输入设备,并且该设备会从/dev/input 中完全消失。
我想知道这个问题是否有一个简单的解决方案,最明显的是在程序终止时不释放打开的文件描述符。更烦人的是产生一个代理进程来简单地持有 FD。
最佳答案
我最终采用了这样的代理方法:
void main(int argc, char **argv) {
create_uinput_device();
print_eventn();
set_argv0_eventn();
if (fork()) {
return;
} else {
//hold the uinput fd
while(1) { sleep(1000); }
}
}
这样当我们 cat/proc/[p]/cmdline 时,我们可以很容易地找到/dev/input/event[n] 以及当前持有它的 pid。我们可以将新的 cmdline memcpy 到 argv0。所以这是一种围绕此的黑客攻击。
同样方便的是,当我们运行这个程序时,我们会立即返回我们需要转发给 qemu 的/dev/input/event[n] 设备;由于打印。
要真正解决这个问题,需要有人合并到 qemu 更改中,以便 qemu 本身创建虚拟输入设备,由于可以传递大量选项,这非常复杂。不管怎样,一旦发现,由 uinput 创建的虚拟输入设备将与 qemu 实例一样长。
关于c++ - linux 防止文件描述符在程序退出时关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42017157/