我想知道当两个进程同时写入字符设备文件时会发生什么。目前,我最担心的是 Raspberry pi 上的 /dev/spidev0.0。
如果我正确地假设驱动程序的任务是处理并发写入,那么驱动程序是否会看到哪些进程写入了哪些数据?或者驱动程序是否只看到所有并发写入混合在一起的连续数据流?
答案1
查看 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()
。
任何写入的写入器都保证写入整个缓冲区,而不会与其他写入器交错。