Here is the content of a file that defines N locks. See if it can help you.
/* filelock.c -- Defines mutexes in terms of locks on files. * filelock, filelockCreate, filelockDelete, * filelockLock, filelockUnlock */ #include <sys/types.h> #include <fcntl.h> #include <unistd.h> typedef struct { int fd; int n;} filelock; /* Create N locks and returns the id of this cluster of locks. */ filelock * filelockCreate(char *filename, int n) { filelock *fl = (filelock *)malloc(sizeof(filelock)); if (((fl->fd) = open(filename, O_WRONLY | O_CREAT | O_TRUNC, S_IWUSR)) < 0) { perror("open"); exit(1);} fl->n = n; return fl; } /* Delete the cluster of locks associated with fl. */ int filelockDelete(filelock *fl) { if (close(fl->fd) < 0) { perror("close"); exit(1);} return free(fl); } /* Given the lock cluster fl, lock its ith element */ int filelockLock(filelock *fl, int i) { if ((i < 0) | (i >= fl->n)) { printf("filelockLock needs i in range 0 .. %d\n", (fl->n)-1); exit(0);} if (lseek(fl->fd, i, SEEK_SET) < 0) { perror("lseek"); exit(1);} if (lockf(fl->fd, F_LOCK, 1) < 0) { perror("lockf"); exit(1);} } /* Given the lock cluster fl, unlock its ith element */ int filelockUnlock(filelock *fl, int i){ if ((i < 0) | (i >= fl->n)) { printf("filelockUnlock needs i in range 0 .. %d\n", (fl->n)-1); exit(0);} if (lseek(fl->fd,i, SEEK_SET) < 0) { perror("lseek"); exit(1);} if (lockf(fl->fd, F_ULOCK, 1) < 0) { perror("lockf"); exit(1);} }Here is a program that tests if the locks are working:
/* lockfmain.c - */ /* This is just a driver to test the filelock objects defined in lockf.c */ /* MAXCHILD processes are forked. They take turns in using LOCKSSIZE locks.*/ /* I compiled the progarm as follows */ /* cc lockfmain.c lockf.c -o lockmain */ /* and then run the image lockmain. */ /* Notice that after the program has run I find the file "mylock" in my */ /* directory. Not very desirable. Perhaps there is a way to avoid that? */ #include <stdio.h> #include <sys/types.h> #include "lockf.h" #define LOCKFILE "mylock" #define LOCKSSIZE 3 #define MAXCHILD 4 void child (int self); pid_t cldrn[4]; filelock *fl; int main(void){ int i; fl = filelockCreate(LOCKFILE, LOCKSSIZE); for (i=0;iwhere the file lockf.h is just:
/* lockf.h -- Defines mutexes in terms of locks on files. * filelock, filelockCreate, filelockDelete, * filelockLock, filelockUnlock */ typedef struct { int fd; int n;} filelock; /* Create N locks and returns the id of this cluster of locks. */ extern filelock * filelockCreate(char *filename, int n); /* Delete the cluster of locks associated with fl. */ extern int filelockDelete(filelock *fl); /* Given the lock cluster fl, lock its ith element */ extern int filelockLock(filelock *fl, int i); /* Given the lock cluster fl, unlock its ith element */ extern int filelockUnlock(filelock *fl, int i);ingargiola@cis.temple.edu