我有一个特殊的用例,在linux上使用uinput http://thiemonge.org / getting-started-with-uinput ,创建虚拟输入设备的过程,如果它在默认情况下消失,则释放所有打开的文件描述符。


在此它还会释放创建的虚拟输入设备,并且设备变平从/ dev / input中消失。


我想知道是否有这个问题的简单解决方案,最明显的是在程序终止时不释放打开的文件描述符。产生代理进程以简单地保存FD的比较烦人。

答案 0 :(得分:1)
我最终采用了代理方式:
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实例一样长。