Files
對字元設備文件的並發寫訪問
我想知道當兩個程序同時寫入字元設備文件時會發生什麼。目前,我最擔心的是樹莓派上的 /dev/spidev0.0。
如果我正確地假設處理並發寫入是驅動程序的任務,那麼驅動程序是否會看到哪些程序寫入了哪些數據?或者驅動程序是否只看到所有並發寫入混合在一起的連續數據流?
查看 Linux 5.4.97 核心原始碼,我看到了
drivers/spi/spidev.c
. 在該文件中,我看到了處理寫入請求的函式:ssize_t spidev_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos) { struct spidev_data *spidev; ssize_t status = 0; unsigned long missing; /* chipselect only toggles at start or end of operation */ if (count > bufsiz) return -EMSGSIZE; spidev = filp->private_data; mutex_lock(&spidev->buf_lock); missing = copy_from_user(spidev->tx_buffer, buf, count); if (missing == 0) status = spidev_sync_write(spidev, count); else status = -EFAULT; mutex_unlock(&spidev->buf_lock); return status; }
注意對
mutex_lock()
和的呼叫mutex_unlock()
。呼叫write()
字元設備的程序將獲取互斥鎖,寫入其所有數據,然後解鎖互斥鎖。如果在該過程中出現了其他編寫器,則該編寫器將阻止對 的呼叫,mutex_lock()
直到現有編寫器呼叫mutex_unlock()
.任何寫入的寫入器都保證寫入整個緩衝區,而不會與其他寫入器交錯。