File Locking in C

Inhoud


Inleiding

Het gehele idee achter file-lock is om een gegevens mutual exclussive te maken .
Dat betekend dat gegevens maar voor 1 programma/gebruiker toegangkelijk is .
In Linux worden deze 'locks' meestal opgeslagen in /var/lock , maar kan willekeurige zijn .
Dit wordt berijkt door voordat de data wordt aangesproken een Lock-File te openen . Deze Lock-file heeft als bijzonderheid dat gevraagd wordt te openen met de status EXCLUSIEF . Dat geeft aan dat maar 1 gebruiker deze file mag aanmaken .
Is de file reeds bestaand dan zal een fout worden gegeven in de trand van 'lock-file' ingebruik .
Als het gelukt is een 'lock-file' aantemaken dan kan men de gewenste file gaan gebruiken .
Wil men de 'Lock' weer vrijgeven dan verwijder de 'lock-file' .

Alles staat en valt met het feit dat iedere gebruiker van het bestand eerst test of de 'lock-file' gegeven is . Doet men die niet dan heeft het niet veel zin om op deze manier een bestand uniek toegangkelijk te maken .

Het is een beetje tevergelijken met de P-V semaforen (Dijkstra-Hoare) .


Voorbeeld

Dit voorbeeld werkt onder Linux (GNU C)en onder Windows(Mingwin,DJCPP vertalers) en Dos(DJCPP vertaler)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
//#include <unistd.h>
#include <errno.h> /* alleen nodig als je 'perror() gebruikt */

#define FNAME "locki"

int filelock(char* filename,int mode)
{ int result,fd;

  char* lck=malloc(strlen(filename)+4);
  /*maybe memcpy works faster ?*/
  strcpy(lck,filename);
  strcat(lck,".lck");

  if (mode) {
     fd = open(lck, O_WRONLY|O_CREAT|O_EXCL);
     if (fd<0 && errno==EEXIST) {
        /* file already exits another process is holding the lock */
        result=-1;
     } else if(fd<0) {
       // perror("Locking failed for following reason");
       result=-2;
     } else {
       /* locked write maybe pid to file or canbe used for other ID's */
       sprintf(lck,"%d\n",getpid());
       /* this means that PID must be shorter or equal as len(lck) !  */
       write(fd,lck,strlen(lck)+1);
       result=0;
     }
     close(fd);
  } else {
     remove(lck);
     result=0;
  }

  free(lck);
  return result;
}


int main(int argc, char **argv)
{
  int islock;
  char buffer[100];

  islock = filelock(FNAME,1);

  if(islock){
    printf("no lock\n");
  } else {
    printf("has lock\n");
  }

  /* unlock */
  filelock(FNAME,0);
  return 0;
}

Waarom

Als je een modem apparaat hebt wil je meestal dat deze maar door 1 gebruiken wordt gebruikt .
Dit kun je berijken door het modem te locken aan 1 gebruiker .

Database file's hebben ook een probleem als meerdere gebruiker gelijktijdig informatie zouden willen wijzigen of toevoegen .
Dat betekend dat voordat een gebruiker gaat wijzigen in een database hij deze moet locken opdat zeker is dat hij opdat moment de enigste is die er in ziet te schrijven .
 


Heb je nuttige tips mail mij