web-dev-qa-db-ja.com

ユーザースペースプログラムは、プログラムとの間でデータをやり取りするためのsysfsまたはprocfsファイルを提供/実装できますか?

カーネルスペースデバイスドライバーは通常、/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>'は、プログラムに値を渡すことを示します。そのため、実行中にプログラムのさまざまなパラメータを簡単に確認して突くことができます。

2
Ribo

カーネルの外部に/sysまたは/procエントリを追加する方法はないと思います。 /sysの場合、とにかくあまり意味がありません。これは、kobjectデータ構造の直接表現です。

ただし、FIFOを使用するなど、ユーザースペースから同様のインターフェイスを提供できます。詳細については、 mkfifo を参照してください。これの実装は、sysvinitFIFOを使用してinitctlで確認できます。

1
Stephen Kitt