Linux kernel 为什么';当文件已经存在时,是否创建返回错误?

Linux kernel 为什么';当文件已经存在时,是否创建返回错误?,linux-kernel,filesystems,linux-device-driver,device-driver,chardev,Linux Kernel,Filesystems,Linux Device Driver,Device Driver,Chardev,我正在为一个接口(Linux 4.9.13)编写一个带有字符设备的PCI驱动程序。以下是困扰我的场景: 运行touch/dev/foo0,在/dev目录中创建一个普通文件 加载驱动程序模块。下面是一个伪代码,表示发生了什么(相当标准的字符设备注册): 详情: 索引只是另一个免费索引 我觉得奇怪的是,没有任何东西会引发一个错误,即已经有一个/dev/foo0文件不是字符设备。我确实检查了所有的错误(我想是的),但是为了简洁起见,我省略了相关的代码。如果我不运行touch/dev/foo0,一切

我正在为一个接口(Linux 4.9.13)编写一个带有字符设备的PCI驱动程序。以下是困扰我的场景:

  • 运行
    touch/dev/foo0
    ,在
    /dev
    目录中创建一个普通文件
  • 加载驱动程序模块。下面是一个伪代码,表示发生了什么(相当标准的字符设备注册):

    详情:

    • 索引
      只是另一个免费索引
  • 我觉得奇怪的是,没有任何东西会引发一个错误,即已经有一个
    /dev/foo0
    文件不是字符设备。我确实检查了所有的错误(我想是的),但是为了简洁起见,我省略了相关的代码。如果我不运行
    touch/dev/foo0
    ,一切正常。否则,我既不能读取也不能写入设备


    为什么会这样?
    device\u create
    不应该返回错误,或者至少应该创建
    /dev/foo1

    /dev
    下的文件是由
    device\u create()
    创建的,而不是由
    cdev\u add
    @Tsyvarev Good point创建的。谢谢我会再检查一次我的代码。@Tsyvarev-Nah,我会检查
    设备创建的
    错误和
    是错误的,并且不会失败。嗯……乌代夫不应该关心这种情况吗?@0andriy你可能是对的——这是我最近听到的。不过我没有时间确认。
    /dev
    下的文件是由
    device\u create()
    创建的,而不是由
    cdev\u add
    @Tsyvarev Good point创建的。谢谢我会再检查一次我的代码。@Tsyvarev-Nah,我会检查
    设备创建的
    错误和
    是错误的,并且不会失败。嗯……乌代夫不应该关心这种情况吗?@0andriy你可能是对的——这是我最近听到的。不过我还没来得及证实。
    
    // When the module is initialized:
    alloc_chrdev_region(&dev, 0, 256, "foo");
    class = class_create(THIS_MODULE, "foo");
    
    // Later, when a suitable PCI device is connected the probe function 
    // calls the following functions:
    cdev_init(dev->md_cdev, &fops);
    dev->md_devnum = MKDEV(major, 0 + index);
    res = cdev_add(dev->md_cdev, dev->md_devnum, 1);
    dev->md_sysfsdev = device_create(class, 0, dev->md_devnum, 0, "foo%d", index);