/sys
カーネル空間デバイスドライバは通常、配信または表示されるディレクトリとファイルを実装します/proc
。長い間実行されているユーザースペースプログラムもこれを実行できますか?
一部のデータを照会し、実行時に外部プログラムでいくつかのデータを設定できる必要があるデーモンまたは長期実行プログラムがあります。
完全なソケットインタフェースを実行できますが、これはプログラムと外部の要求者にとって多くのオーバーヘッドになります。
Linuxカーネル開発者が見つけたように、「すべてがファイルです」モデルを使用することは、カーネル設定を調整するのに非常に便利です。私も同じことをしたい。
ディレクトリをカーネルの神聖な空間として考える人もいますが、/sys
「システム」と他のサービス/サーバー/アプリケーションとの間の重要な境界は見えません。
ヒューズを使用してください... 私は「USERspaceのファイルシステム」パッケージlibfuse3.soであるFUSEを使用することにしました。 (ラッパーを作成した後...)アクセス変数/ファイルごとに1つの構造体配列を定義できます。
struct fileObj files[] = {
{"mode", mode, getFunc, putFunc},
{"numbProcs", numbProcs, getFunc, putFunc},
{"svrHostPort", hostPort, getFunc, putFunc},
{"somethingWO", jakeBuf, NULL, putFunc}, // Write only file (why?)
{"timestamp", NULL, getTimestampFunc, NULL}, // Returns timestamp, R/O
{0}
};
FUSEファイルシステムのマウントポイントは、「/ ssm / fuse」... 、1つはW / Oです。 「get」関数の場所の「getTimestampFunc」は、特殊関数がファイルに関連付けられて計算された応答を実行できることを示します。
ribo@box:~/c$ ls -l /ssm/fuse
total 0
-rw-r--r-- 1 ribo ribo 10 Dec 28 17:17 mode
-rw-r--r-- 1 ribo ribo 1 Dec 28 17:17 numbProcs
--w------- 1 ribo ribo 3 Dec 28 17:17 somethingWO
-rw-r--r-- 1 ribo ribo 5 Dec 28 17:17 svrHostPort
-r--r--r-- 1 ribo ribo 32 Dec 28 17:17 timestamp
ribo@box:~/c$ cat /ssm/fuse/timestamp
18/12/28 17:17:27ribo@box:~/c$cat /ssm/fuse/mode
hyperSpeedribo@box:~/c$ echo slow >/ssm/fuse/mode
ribo@box:~/c$ cat /ssm/fuse/mode
slow
「echo>」は、プログラムに値を渡すことを示します。したがって、プログラムの実行中にプログラムのさまざまなパラメータを表示して確認するのは簡単です。
ベストアンサー1
カーネルの外側に項目を追加したり項目を追加したりする方法はないと思います/sys
。とにかくあまり意味がない/proc
ので、kobjectデータ構造を直接表現したのです。/sys
ただし、たとえば、FIFOを使用してユーザースペースで同様のインターフェースを提供できます。mkfifo
もっと学ぶ。 FIFOsysvinit
で実装を見ることができますinitctl
。