単一のデバイスがユーザを作るために、次の開かれた以外は、プロセス内の複数のデバイスを開きますが、ユーザーが読むと、いくつかのプロセスから書くことができますので、このソリューションは、簡単にデバイスをテストすることができ、デバイスを開くために一つだけのユーザーを使用できますが、このようなチェックは通常、ライセンスチェックの後に行われ、そしてだけに所有されているよりも、アクセスがより制限することができます。ユーザーはこのopenメソッドにチェックを追加することによって達成されるアクセスの数でデータの整合性を維持する責任があることを前提としてい制限を指定した人やグループ許可ビット。これはttysのであり、使用アクセス戦略は同じですが、それは外部の特権プログラムには依存しません。
これらのアクセス戦略は、この場合には、単一よりも、いくつかの奇妙なを開くために政策を実施するために、2:オープン数とUID機器再び所有者、このための最高の場所は、機器の構造に関するものである。我々理由の理由の代わりに、グローバル変数の使用例は、以前にscullsingleを説明した。sculluidデバイスはその名前です。
オープンコールは、あなたが最初にアクセスを開くが、デバイスの所有者を覚えているとき。これは、ユーザーは、このように複数のプロセスが機器の同時動作を調整することができ、デバイスを複数回開くことができることを意味することに同意するものとします。同時に、他のユーザーがそれを開くことができません関連するセクションがここにコピーされるので、このように、機能のこのバージョンとほぼ同じ理由の前に、外部の干渉を回避します:
spin_lock(&scull_u_lock)。(scull_u_count場合&&
(scull_u_owner!=の電流> UID)&& / * / *ユーザーは/(scull_u_owner!=の電流> EUID)&& / * SU *をした誰でもできるように許可します
!(CAP_DAC_OVERRIDE)対応)
{/ *まだ許可ルート* /
spin_unlock(&scull_u_lock)。
-EBUSYを返します。/ * -EPERMは、ユーザーを混乱させる* /
}
もし(scull_u_count == 0)
scull_u_owner =の電流> UID。/* それをつかむ */
scull_u_count ++; spin_unlock(&scull_u_lock)。
これらの変数を確保するために、我々はそれらへのアクセスを制御するスピンロックを使用する。デバイスへのアクセスを制御するための2つの変数(scull_u_ownerとscull_u_count)がある場合sculluid、したがって、複数のプロセスが同時にアクセスされることがあります(scull_u_lock)。このロックがなければ、2つ(またはそれ以上)のプロセスが同時にscull_u_countテストし、彼らは機器の所有権を持っていることを考える可能性があることができる。ここでは、スピンロックの使用をロックが非常に短い時間に保持されているので、ロックを保持しながら運転は、物事に任意の睡眠を行いません。
私たちは、コードが正しい方向へのアクセスを拒否されたユーザーを与えるためにライセンス中に検出された場合でも、-EBUSY -EPERMを返すために、代わりに選んだ。応答は、多くの場合、モードチェックの/ devファイルと所有者である「許可が拒否されました」についてそして「忙しいデバイスが」正しく、ユーザーがデバイスを使用することで、すでにプロセスを探す必要がありますことをお勧めします。
そう、所有者は、プロセスが、この場合の作業のためのオープンなデバイスCAP_DAC_OVERRIDE能力がない場合であっても許可されている開いた場合、このコードは、プロセスを開こうとすると、ファイルのアクセス権を上書きする能力を持ってwhether'reどうかをチェックします。
releaseメソッドは次のようになります。
静的int型scull_u_release(構造体のinode * iノード、構造体ファイル*の財投)
{
spin_lock(&scull_u_lock)。scull_u_count--; / *何も* / spin_unlock(&scull_u_lock)。
0を返します。
}
ここでも、我々は他のプロセスとの競争を持っていないことを確認するために、それは数える変更する前にロックを取得する必要があります。