カーネルスペースデバイスドライバーは通常、/sys
または/proc
を介して表示されるディレクトリとファイルを実装します。長時間実行されているユーザースペースプログラムでもこれを行うことができますか?
一部のデータを照会できるようにする必要があるデーモンまたは長時間実行プログラムがあり、実行中に外部プログラムによって一部のデータセットがあります。
本格的なソケットインターフェイスを実行できますが、それはプログラムと外部リクエスターにとって大きなオーバーヘッドです。
Linuxカーネル開発者が見つけたように、「すべてがファイルである」モデルを使用すると、カーネル設定を微調整するのに役立ちました。同じことをしたいのですが。
/sys
ディレクトリはカーネルの神聖な空間であると考える人もいるかもしれませんが、「システム」とは何かと他のサービス/サーバー/アプリケーションとの間に重要な線は見当たりません。
Fuseを使用しています...「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'です... 'ls -l'は、 'files'配列の各エントリがファイル、一部のR/O、一部のR/W、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>'は、プログラムに値を渡すことを示します。そのため、実行中にプログラムのさまざまなパラメータを簡単に確認して突くことができます。
カーネルの外部に/sys
または/proc
エントリを追加する方法はないと思います。 /sys
の場合、とにかくあまり意味がありません。これは、kobjectデータ構造の直接表現です。
ただし、FIFOを使用するなど、ユーザースペースから同様のインターフェイスを提供できます。詳細については、 mkfifo
を参照してください。これの実装は、sysvinit
FIFOを使用してinitctl
で確認できます。