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