C Блокировка файлов в Windows и Linux - PullRequest
2 голосов
/ 27 апреля 2011

Я изучил приведенные ниже примеры для понимания блокировки файлов в Windows и Linux. Программа 1 работает как на Windows, так и Linux с GCC.

Но второй работает только на Linux. Особенно проблема в winodws GCC заключается в декларации структуры flock. Я не знаю, пропускаю ли я что-нибудь здесь. Кроме того, даже после того, как я закрою и отсоединю файл в первом примере для следующего запуска, файл не разблокируется.

Программа 1: Работа в Windows с GCC

Источник: http://www.c.happycodings.com/Gnu-Linux/code9.html

#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
int main()

{
    if((fd = open("locked.file", O_RDWR|O_CREAT|O_EXCL, 0444)) == -1) 
    {
        printf("[%d]: Error - file already locked ...\n", getpid());
    } 
    else 
    {
    printf("[%d]: Now I am the only one with access :-)\n", getpid());
    close(fd);
    unlink("locked.file");
}

Программа 2: Работа в Linux с GCC

Источник: http://beej.us/guide/bgipc/output/html/multipage/flocking.html

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
                    /* l_type   l_whence  l_start  l_len  l_pid   */
    struct flock fl = {F_WRLCK, SEEK_SET,   0,      0,     0 };
    int fd;
    fl.l_pid = getpid();
    if (argc > 1) 
        fl.l_type = F_RDLCK;
    if ((fd = open("lockdemo.c", O_RDWR)) == -1) {
        perror("open");
        exit(1);
    }
    printf("Press <RETURN> to try to get lock: ");
    getchar();
    printf("Trying to get lock...");
    if (fcntl(fd, F_SETLKW, &fl) == -1) {
        perror("fcntl");
        exit(1);
    }
    printf("got lock\n");
    printf("Press <RETURN> to release lock: ");
    getchar();
    fl.l_type = F_UNLCK;  /* set to unlock same region */
    if (fcntl(fd, F_SETLK, &fl) == -1) {
        perror("fcntl");
        exit(1);
    }
    printf("Unlocked.\n");
    close(fd);
    return 0;
}

Не могли бы вы помочь с этим и, если возможно, предоставить рекомендации для переносимого кода в этих сценариях?

Ответы [ 2 ]

1 голос
/ 01 мая 2011

Вероятно, будет трудно добиться протабильности с помощью такого рода операций с использованием библиотеки C Runtime LIBrary. Вам действительно нужно использовать специфический для ОС код для такого рода вещей.

Но, возможно, вы сможете заставить это работать, изучая и понимая основные имплиментации C Runtime Library. Исходный код для времени выполнения GCC и времени выполнения Microsofot поставляется с инструментами. Просто посмотрите и посмотрите, как они реализованы.

Обратите внимание, что в Windows вы можете использовать API ввода / вывода файлов CRT с дескрипторами Windows. Просто посмотрите на источник.

0 голосов
/ 25 октября 2014

Я хотел бы изучить XPDEV , в частности, методы обертки файлов ... они реализуют разумную межплатформенную блокировку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...