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;
}
_______________________________________________
[EMAIL PROTECTED] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to "[EMAIL PROTECTED]"



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
_______________________________________________
[EMAIL PROTECTED] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to