サードパーティ製アプリケーションが開いてはいけないデバイスノードを開く問題が発生しました。
メッセージ処理を実行するSPIスレーブドライバを作成しました。ドライバが「初期化モード」でロードされると、特定のメッセージでのみ応答します。通信を再初期化するには、ドライバを削除して再ロードする必要があります。問題は、システムにすべての文字デバイスを開くルートとして実行されるサードパーティ製のアプリケーションがあることです。これを行う唯一の方法は、アプリケーションを停止して削除することです。これにより、プロジェクト全体に大きな問題が発生する可能性があります。
実際のデバイスノードなしでキャラクターデバイスへの接続を開くことは可能ですか? fopen( '/dev/spi')を使用すると、再ロードする必要があり、上記の問題が発生するまですべてがうまく機能します。実際の/dev/spiファイルなしで特定の州/マイナーノード番号のファイル記述子を生成するすべての種類のシステムコールを作成できますか?
答え1
問題のアプリケーションが/dev
ツリーのデバイスノードのみを開く場合その後、自分のプログラムで動作している場合は、デバイスノードを別の場所に配置できます。
デバイスノードが存在するファイルシステムには、デバイスノードdev
ファイルが特別に処理されるようにマウントオプションが設定されている必要があります。
(免責事項:私はこれをテストしていませんが、以前も同様のことをしたことがあります...)
tmpfs
たとえば、小さなファイルシステムをマウントし、/my-dev/
そこにデバイスノードを作成することが1つの例です。
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
同様のものを確認してください。いいえデバイスのノードを作成します。 )