Trying to understand flock()
jason
jason at ec.rr.com
Wed Nov 3 18:49:48 PST 2004
Ronald F. Guilmette wrote:
>Greetings friends,
>
>I wonder if someone would be kind enough to enlighten me about the
>semantics of the flock(2) function. I have RTFM'd, and I am sad to
>say that I am still rather mystified that flock() doesn't seem to
>do what it is documented as doing. (I am testing it on 4.10-RELEASE,
>by the way.)
>
>The short test program attached below illustrates the source of my
>abundant confusion. When I compile this program with -DUSE_FCNTL
>(thus forcing it to use fcntl(2) to implement exclusive file locking)
>and then execute it, the resulting behavior is exactly what I expect,
>i.e. the program prints the string "Temp file locked (1)", and then it
>pauses for 10 seconds, and then it prints "Temp file locked (2)". The
>delay time between the appearance of the two message indicates clearly
>that exclusive file locking is working as expected.
>
>When I compile this program WITHOUT the -DUSE_FCNTL option however
>(thus forcing the program to use flock() rather then fcntl() for file
>locking), there is no apparent delay between the printing of the first
>message and the printing of the second message.
>
>That is what has me mystified.
>
>Obviously, there is something (or maybe several things) about the actual
>semantics of flock(2) that I don't understand. I would appreciate it if
>someone would enlighten me about that.
>
>
>Regards,
>rfg
>
>
>P.S. My apologies in advance if you try to Cc: me directly on your reply
>to this posting, and if your response gets rejected by the local spam
>filters. It's nothing personal. Really. We just have about 2/5ths of
>the entire Internet blacklisted here due to past spamming incidents. I
>will look for replies also in the freebsd-general list archives, so if
>you prefer, you can just repl to the list. Thanks and hasta la vista.
>
>
>========================================================================
>#include <stdio.h>
>#include <string.h>
>#include <errno.h>
>#include <unistd.h>
>#include <sys/file.h>
>#include <fcntl.h>
>
>static void
>die (register char const *const fmt)
>{
> fprintf (stderr, fmt, strerror (errno));
> fprintf (stderr, "\n");
> exit (1);
>}
>
>static int
>lock_exclusive (register int const fd)
>{
>#if USE_FCNTL
> auto struct flock fl;
>
> fl.l_start = 0;
> fl.l_len = 0;
> fl.l_pid = 0;
> fl.l_type = F_WRLCK;
> fl.l_whence = SEEK_SET;
> return fcntl (fd, F_SETLKW, &fl);
>#else
> return flock (fd, LOCK_EX);
>#endif
>}
>
>int
>main (void)
>{
> static char template[] = "/tmp/temp.XXXXXXXXXX";
> register int fd;
>
> fd = mkstemp (template);
> unlink (template);
>
> if (lock_exclusive (fd) == -1)
> die ("Error creating exclusive lock: %s");
> fprintf (stderr, "Temp file locked (1)\n");
>
> if (fork () == 0)
> {
> if (lock_exclusive (fd) == -1)
> die ("Error creating exclusive lock: %s");
> fprintf (stderr, "Temp file locked (2)\n");
> }
>
> sleep (10);
>
> close (fd);
> return 0;
>}
>_______________________________________________
>freebsd-questions at freebsd.org mailing list
>http://lists.freebsd.org/mailman/listinfo/freebsd-questions
>To unsubscribe, send any mail to "freebsd-questions-unsubscribe at freebsd.org"
>
>
>
I am on 5.3RC1, and I know your version is not the same, but have you
updated you docs? It works just like updating the system. From my
manpage you are missing
#include <sys/file.h> (I see you have this, but I will
leave it anyway)
#define LOCK_SH 0x01 /* shared file lock */
#define LOCK_EX 0x02 /* exclusive file lock */
#define LOCK_NB 0x04 /* don't block when locking */
#define LOCK_UN 0x08 /* unlock file */
int
flock(int fd, int operation);
An example:
int
flock(int fd, int LOCK_EX);
Where is the above in your code? I must say I have only done some
generic C programming for my school class, but this seems easly enough.
I hope it is outof date docs on your system causing you pain.
Jason
More information about the freebsd-questions
mailing list