これには、状況に応じてセマフォ/スピン ロックが必要です。以下は単純なキャラクタードライバーコードです。デバイスを開く関数が呼び出されると、他のプロセスがデバイスを開いているかどうかを確認し、開いている場合は、デバイスが閉じるのを待ちます。デバイスが他のプロセスで使用されていない場合は、デバイスを開くことができます。これは、セマフォを使用して実現されます。プロセスは、セマフォを取得してコードにアクセスする必要があります。完了したら、セマフォを解放する必要があります/解放する必要があります。以下は、開く関数と閉じる関数です。
static int device_open(struct inode *inode, struct file *filp) {
if(down_interruptible(&sem) != 0) {//take the semaphore
printk(KERN_ALERT "megharajchard : the device has been opened by some other device, unable to open lock\n");
return -1;
}
//buff_rptr = buff_wptr = device_buffer;
printk(KERN_INFO "megharajchard : device opened succesfully\n");
return 0;
}
ここで、プロセスはデバイスを開こうとします。セマフォを取得する必要があります。セマフォが取得されると、他のプロセスはデバイスを開くことができなくなります。
以下は、他のプロセスがデバイスを開いて使用できるように、プロセスがセマフォを解放するクローズ デバイス関数です。
static int device_close(struct inode *inode, struct file *filp) {
up(&sem);// release the semaphore
printk(KERN_INFO "megharajchard : device has been closed\n");
return ret;
}
アトミックとは、プロセスがスリープできない状況を意味し、通常は割り込みコンテキストで実行中に発生します。プロセスの実行中にスリープすることはできません。このような状況でロックを実現するには、スピンロックを使用する必要があります。
さらに何か必要な場合はお知らせください。