2017-02-03 6 views
2

Linuxでuinput http://thiemonge.org/getting-started-with-uinputを使用しているときに、仮想入力デバイスを作成するプロセスがデフォルトで終了すると、開いているファイルディスクリプタがすべて解放されるという特有のケースがあります。linuxがプログラム終了時にファイルディスクリプタを閉じるのを防ぐ

この場合、作成された仮想入力デバイスも解放され、デバイスのフラットアウトは/ dev/inputから消えます。

私は、この問題の簡単な解決策があるかどうか疑問に思っています。最も明らかなのは、プログラムの終了時に開いているファイルディスクリプタを解放しないことです。単にFDを保持するためにプロキシプロセスを生成するために厄介なもの。

+3

プログラムが終了すると、開いているファイルディスクリプタはすべて閉じられます。期間。 –

+3

上記と同様。しかし、ファイル記述子はフォークによって作成された子プロセスに継承されます。親が出て行くと、子供には開いたままになります。 – TrentP

+1

仮想デバイスを作成したプログラムを終了した後に、その仮想デバイスを保持したいのはなぜですか?それを作成するプログラムは、(fdが別のプロセスに渡されない限り)デバイスにイベントを注入するために必要な 'fd 'を持つ唯一のものです。それがなくなると、それ以上イベントが発生することはなく、仮想デバイスには使用できなくなります。 – kaylum

答えて

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); } 
    } 
} 

我々は簡単には/ dev /入力/イベントを見つける[n]とすることができ、私たちの猫の/ proc/[P]/cmdlineをこの方法でpidは現在それを保持しています。 argv0に新しいcmdlineをmemcpyすることができます。だから、これはこれのまわりでハックのようなものです。

また、このプログラムを実行すると、すぐにqemuに転送する必要のある/ dev/input/event [n]デバイスが返されます。印刷物のために。

本当にこれを修正するには、qemuの変更をマージしてqemu自体が仮想入力デバイスを作成する必要があります。これは、渡すことができる膨大なオプションのために非常に複雑です。 uinputによって作成された仮想入力デバイスは、いったん解明されても、qemuインスタンスの長さだけ存続します。

関連する問題