对字符设备文件的并发写访问

对字符设备文件的并发写访问

我想知道当两个进程同时写入字符设备文件时会发生什么。目前,我最担心的是 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()

任何写入的写入器都保证写入整个缓冲区,而不会与其他写入器交错。

相关内容