Files

對字元設備文件的並發寫訪問

  • April 7, 2021

我想知道當兩個程序同時寫入字元設備文件時會發生什麼。目前,我最擔心的是樹莓派上的 /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().

任何寫入的寫入器都保證寫入整個緩衝區,而不​​會與其他寫入器交錯。

引用自:https://unix.stackexchange.com/questions/643839