flock(2) on 4.2bsd
Michael O'Shea
mo at wgivax.UUCP
Fri Mar 28 00:16:39 AEST 1986
>I am using the LOCK_EX (exclusive lock) operation on a file.
>The manual states that if a lock already exists, the call should
>block until lock is available. But in testing,
>if the lock exits, flock returns with an error, EWOULDBLOCK.
>
>It behaves as if I specified (LOCK_EX|LOCK_NB) for the operation,
>the LOCK_NB being no blocking, but I have NOT!
>
>Am I doing something wrong?
You don't give an extract from the code which is doing this, but
assuming you are doing it as the manual states, it should work fine.
I use the following type of construct in several pieces of code on
a Vax 11/780 running vanilla 4.2, and have never had any problems
with them acting as expected (program waits for 5 minutes to get
lock; if it can't get lock, prints appropriate message and exits):
#include <setjmp.h>
#include <signal.h>
jmp_buf lockjump;
xyz()
{
int alarmtrap();
FILE *fopen();
/* open file */
if((file = fopen(NAME,"a+")) == NULL)
{
perror(NAME);
exit(-1);
}
/* wait to get lock for 5 minutes, then exit */
signal(SIGALRM, alarmtrap);
alarm(300);
if(setjmp(lockjump) == 0)
{
if(flock(file->_file,LOCK_EX))
{
fprintf(stderr,"ERROR LOCKING %s\n",NAME);
exit(-1);
}
alarm(0);
}
else
{
fprintf(stderr,"\n\n\n\n");
fprintf(stderr,"Please try at a later time, ");
fprintf(stderr,"someone else is hogging program right now!\n");
fprintf(stderr,"\n\n\n\n");
exit(1);
}
}
alarmtrap() {
alarm(0);
longjmp(lockjump,1);
}
More information about the Comp.unix.wizards
mailing list