質問: 実行可能ファイルへのアクセス/ dev / consoleを許可するにはどうすればよいですか? 内蔵pcのスピーカーを利用する小さなcアプリを作成しました。これを実現するために、私は/dev/consoleと話していると、スピーカーからビープ音が鳴ります。ただし、コンパイルされた実行可能ファイルは、rootとして実行した場合にのみ機能します。実行可能ファイルを実行しているユーザーを適切なグループに追加する必要があることは理解していますが、必要なアクセス許可を持っているグループがわからず、わかりません。現在実行しようとしているユーザー(apache)として実行可能ファイルを実行すると、permission deniedが得られます。何か助けてください?
回答: ファイルへのアクセスを制御するのと同じ方法で、デバイスへのアクセスを制御します。アクセス許可と所有権を確認し、アクセス許可を持つユーザーとして、またはアクセス許可を持つグループのメンバーとしてプログラムを実行します。ただし、少なくとも私のシステムでは、$ ll /dev/console crw------- 1 root root 5, 1 nov 29 06:59 /dev/console /dev/consoleへのアクセス許可はrootのみに制限されているため(おそらく正当な理由で)、rootとして実行するか、udevルールを変更して別の/dev/consoleを作成する必要がありますグループ化してから、このグループのメンバーとしてプログラムを実行します(setgidビットなどを使用)。しかし、pcスピーカーにアクセスするためのより良い方法があります(ほとんど知られていません):スピーカーは入力イベントデバイスとして表示され、正しい形式で書き込むことにより、スピーカー(周波数を含む)を直接制御できます。そのためのシステムに依存しないシンボリックリンクは/dev/input/by-path/platform-pcspkr-event-spkr シンボリックリンクをたどると、次のようなものが表示されます。$ ll /dev/input/by-path/platform-pcspkr-event-spkr lrwxrwxrwx 1 root root 9 nov 29 06:57 /dev/input/by-path/platform-pcspkr-event-spkr -> ../event5 $ ll /dev/input/event5 crw-rw---- 1 root input 13, 69 nov 29 06:57 /dev/input/event5 したがって、inputグループのすべてのメンバーがこのデバイスに書き込むことができます。これは、rootとして実行するよりも安全です。入力システムで使用されるイベントの形式は、/usr/src/linux/documentation/input/input.txtおよびインクルードファイルで説明されています。要約するとstruct input_event { struct timeval time; unsigned short type; unsigned short code; unsigned int value; } タイプはev_snd( "sound")、つまり0x12です。そのような構造体をファイルに書き込むだけです。これにはcも必要ありません。コマンドラインのperlで十分です。例:perl -e 'print pack("qssl", 0, 0x12, 2, 2000)' > /dev/input/by-path/platform-pcspkr-event-spkr ビープ音をオフにしますperl -e 'print pack("qssl", 0, 0x12, 2, 0)' > /dev/input/by-path/platform-pcspkr-event-spkr