/**
@file flock_ex.c
@author Mitch Richling <http://www.mitchr.me/>
@Copyright Copyright 1998 by Mitch Richling. All rights reserved.
@brief How to use flock()
@Keywords UNIX file lock flock
@Std ISOC POSIX UNIX98 BSD4.3 SYSV3
This C program is intended to illustrate how to use
flock(). flock() provides an interface for advisory
locking that is less complex to use than other locking
systems. flock is widely available on across different
UNIX systems. Test this program by running two copies
at the same time, one started slightly after the first
one.
@Tested
- MacOS X.3
*/
#include <stdio.h> /* I/O lib ISOC */
#include <sys/types.h> /* UNIX types POSIX */
#include <errno.h> /* error stf POSIX */
#include <stdlib.h> /* Standard Lib ISOC */
#include <sys/stat.h> /* UNIX stat POSIX */
#include <sys/file.h> /* Locks UNIX */
int main(int argc, char *argv[]);
int main(int argc, char *argv[]) {
int FD;
char buf[] = "hello\n";
int i;
if((FD = open("foo", O_WRONLY | O_CREAT | O_TRUNC, S_IRWXU|S_IRWXG|S_IRWXO)) < 0) {
perror("ERROR: File open");
exit(10);
} /* end if */
/*
LOCK_SH shared lock
LOCK_EX exclusive lock
LOCK_NB don't block when locking
LOCK_UN unlock
*/
printf("Attempting to get lock.\n");
/* NOTE: Use LOCK_SH for shared lock. The LOCK_NB part keeps the
call from blocking, and gives us the chance to make intelligent
decisions in the face of a previously locked resource. */
while(flock(FD, LOCK_EX | LOCK_NB) < 0) {
if(errno == EWOULDBLOCK) {
printf("Could not get lock. Sleeping...\n");
sleep(1);
} else if(errno == EBADF) {
printf("ERROR: The descriptor was not valid.\n");
exit(1);
} else if(errno == EINVAL) {
printf("ERROR: The descriptor was not a file.\n");
exit(1);
} else if(errno == EOPNOTSUPP) {
printf("ERROR: The referenced descriptor is not of the correct type.\n");
exit(1);
} /* end else/if */
} /* end while */
printf("Got the lock.\n");
/* We ignore possible I/O errors as our goal here is to demo
locking, not how to do I/O in a safe way... */
for(i=0; i<10; i++) {
printf("Write..");
write(FD, buf, strlen(buf));
printf("Sleep..\n");
sleep(1);
} /* end for */
close(FD);
printf("Free up lock.\n");
flock(FD, LOCK_UN);
} /* end func main */
Generated by GNU enscript 1.6.4.