你能打开一个已经被同一个程序中的另一个函数打开的文件吗?

Posted

技术标签:

【中文标题】你能打开一个已经被同一个程序中的另一个函数打开的文件吗?【英文标题】: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);

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

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

【问题讨论】:

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

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

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

【讨论】:

以上是关于你能打开一个已经被同一个程序中的另一个函数打开的文件吗?的主要内容,如果未能解决你的问题,请参考以下文章

怎样查看linux进程打开的文件数

如何在我的应用程序中打开窗口并重定向到谷歌播放中的另一个应用程序下载页面

如何查看一个进程中已经打开的文件描述符

使用 Jquery 加载函数从空 div 中的另一个页面加载 div

我可以打开一个套接字并将其传递给 Linux 中的另一个进程吗

如何判断我的程序的另一个实例是不是已经在运行?