C File Locking adfærd på Windows og Linux

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg undersøgte nedenfor eksempler for at forstå filer låsende på windows og linux. Programmet 1 arbejder på både Windows og Linux med gcc. Men den anden arbejder kun på Linux. Især problemet i winodws GCC kommer i strukturen flok erklæring. Jeg ved ikke, om jeg mangler noget her. Også selv efter at jeg har lukket og fjernet linket i 1. eksempel til næste kørsel, er filen ikke låst op.


Program 1: Arbejder på Windows med GCC



Kilde: http://www.c.happycodings.com/Gnu-Linux/code9.html[3]


#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 ...
", getpid());
    } 
    else 
    {
    printf("[\%d]: Now I am the only one with access :-)
", getpid());
    close(fd);
    unlink("locked.file");
}


Program 2: Arbejder på Linux med GCC



Kilde: http://beej.us/guide/bgipc/output/html/multipage/flocking.html[4]


#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
");
    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.
");
    close(fd);
    return 0;
}


Kan du venligst hjælpe med dette og om muligt give retningslinjer for bærbar kode i disse scenarier?

Bedste reference


Det vil sandsynligvis være svært at få protabiltiy med denne type operation ved hjælp af C Runtime LIbrary. Du skal virkelig bruge OS-specifik kode til denne slags ting.


Men du kan muligvis få det til at fungere ved at inspicere og forstå de underliggende C Runtime Library implimentations. Kildekoden til både GCC-runetiderne og Microsofot-løbstiderne kommer med værktøjerne. Bare gå se og se, hvordan de er implimented.


Bemærk, at i Windows kan du bruge CRT-filens I/O-API'er med Windows-håndtag. Bare gå kig på kilden.

Andre referencer 1


Jeg ville se nærmere på XPDEV specifikt filindpakningsmetoderne ... de gennemfører rimelig cross-platform låsning. [5]