c++ - linux 防止文件描述符在程序退出时关闭

标签 c++ c linux file unix

我有一个特殊的用例,在 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/

相关文章:

c - C 中 *string 的 UpCase

关闭非阻塞套接字

c - 从 proc 获取进程信息

c - 构建 Linux 调试器 C

c++ - 可变参数模板 : invalid use of void expression

c++ - 按 vector 对中的索引删除元素

C 字符数组比较

linux - 从 awk 中排除列

c++ - 是否可以在 Qt Creator 中使用 .pro 文件在 Qt 中构建 Mac .framework?

c++ - 在没有 C# 代码的情况下使用 EWS 访问 Exchange 邮件?