サードパーティのアプリケーションが、開くべきではないデバイス ノードを開いてしまうという問題が発生しています。
私は、メッセージの処理を行う SPI スレーブ デバイス ドライバーを作成しました。ドライバーがロードされると、特定のメッセージにのみ応答する「初期化モード」になります。通信を再初期化するには、ドライバーをアンロードして再ロードする必要があります。問題は、システムに、すべてのキャラクタ デバイスを開く、ルートとして実行されるサード パーティ アプリケーションがあることです。これをすべて機能させる唯一の方法は、アプリを停止してアンロードすることですが、これはプロジェクト全体に大きな問題を引き起こします。
実際にデバイス ノードがなくても、キャラクター デバイスへの接続を開くことは可能ですか? 現在、fopen('/dev/spi') を使用していますが、リロードが必要になり、上記の問題が発生するまではすべて正常に動作します。実際の /dev/spi ファイルがなくても、特定のメジャー/マイナー ノード番号へのファイル記述子を生成するシステム コールは何かありますか?
答え1
問題のあるアプリケーションが/dev
ツリー内のデバイスノードのみを開く場合独自のプログラムで機能する場合は、デバイス ノードを別の場所に配置できます。
dev
デバイス ノードが存在するファイル システムでは、デバイス ノード ファイルを特別に処理できるようにマウント オプションを設定する必要があります。
(免責事項: 私はこれをテストしていませんが、以前に同様のことを行ったことがあります...)
tmpfs
一例としては、たとえば小さなファイルシステムをマウントし/my-dev/
、そこにデバイスノードを作成することが挙げられます。
mkdir -p /my-dev
mount -t tmpfs -o dev,size=<size> tmpfs /my-dev
mknod /my-dev/spi <type> <maj> <min>
どこ<size>
tmpfsのサイズです。<type>
はデバイスノードタイプであり、<maj> <min>
mount
はメジャー:マイナーデバイス番号です。それぞれおよびのマニュアルページを参照してくださいmknod
。
...そしてfopen("/my-dev/spi")
プログラム内で使用します。
(そしてもちろん、udev
または同様のものがないデバイスのノードを作成します。