【问题标题】:Can you open a file that is already open by another function in the same program?你能打开一个已经被同一个程序中的另一个函数打开的文件吗?
【发布时间】:2020-04-29 09:30:52
【问题描述】:

我编写了一个设备驱动程序,它可以创建 3 个具有相同文件系统的设备。因此,基本上所有 3 个设备在调用时都会重定向到相同的文件操作。 还有另一个用户程序可以逐个打开单个设备以访问其中的数据。假设我在访问另一个设备之前没有关闭设备,会有什么后果?

fd1 = open("/dev/dummy1", O_RDWR);
if(fd1 < 0){
    printf("Cannot open file");
    return -1;
}

if(ioctl(fd1, DV_DAT, data) == -1){
        printf("issue in getting data\n");
    }
else{
    printf("%d\n", data);
}

fd2 = open("/dev/dummy2", O_RDWR);
if(fd2 < 0){
    printf("Cannot open file");
    return -1;
}

if(ioctl(fd2, DV_DAT, data) == -1){
        printf("issue in getting data\n");
    }
else{
    printf("%d\n", data);
}

close(fd2);

fd3 = open("/dev/dummy3", O_RDWR);
if(fd3 < 0){
    printf("Cannot open file");
    return -1;
}

if(ioctl(fd3, DV_DAT, data) == -1){
        printf("issue in getting data\n");
    }
else{
    printf("%d\n", data);
}

close(fd3);
close(fd1);

这个尝试是为了测试一个真实的场景,其中所有三个设备节点都被认为是独立的,并且可以被不同的程序同时访问。这是当一个程序已经打开文件并在另一个程序打开文件时正在处理它。

有什么办法可以解决这个问题?我如何确保不会导致内核崩溃?

【问题讨论】:

  • 开发人员懒得考虑对象生命周期的大多数文件操作问题。您正在等待的后果是内核崩溃。

标签: file-io linux-device-driver fopen ioctl


【解决方案1】:

我发现了问题。实际上,导致内核崩溃的不是设备。在文件的每个打开函数中,我都使用 kmalloc 分配内存。在每个版本中,我都在为同一个缓冲存储器调用 kfree 函数。因此,当调用多个设备时,同一个指针指向已分配的内存。并且 kfree() 在同一个指针上执行了两次。这是一个双重 kfree 问题。我通过在每个 kfree 之后将指针设为 NULL 并在执行 kfree 之前将其设置为条件来解决它。

if(kernel_buffer){
    kfree(kernel_buffer);
    kernel_buffer = NULL;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多