Можете ли вы открыть файл, который уже открыт другой функцией в той же программе? - PullRequest
0 голосов
/ 29 апреля 2020

Я написал драйвер устройства, который создает 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 Ответ

0 голосов
/ 01 мая 2020

Я нашел проблему. На самом деле это были не устройства, которые были ответственны за сбои ядра. При каждой открытой функции файла я выделял память, используя kmallo c. И при каждом выпуске я вызывал функцию kfree для одной и той же буферной памяти. Поэтому при вызове нескольких устройств один и тот же указатель указывает на выделенную память. и kfree () выполняется для одного и того же указателя дважды. Это проблема double kfree . Я решил это, делая указатель NULL после каждого kfree и помещая его как условие перед выполнением kfree.

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