From owner-freebsd-questions@FreeBSD.ORG Thu Nov 4 02:49:48 2004 Return-Path: Delivered-To: freebsd-questions@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 1520616A4CE for ; Thu, 4 Nov 2004 02:49:48 +0000 (GMT) Received: from ms-smtp-03-eri0.southeast.rr.com (ms-smtp-03-lbl.southeast.rr.com [24.25.9.102]) by mx1.FreeBSD.org (Postfix) with ESMTP id 6810F43D39 for ; Thu, 4 Nov 2004 02:49:47 +0000 (GMT) (envelope-from jason@ec.rr.com) Received: from [192.168.1.103] (cpe-065-184-201-054.ec.rr.com [65.184.201.54]) iA42nhkc007342; Wed, 3 Nov 2004 21:49:44 -0500 (EST) Message-ID: <4189990B.7050806@ec.rr.com> Date: Wed, 03 Nov 2004 21:50:51 -0500 From: jason User-Agent: Mozilla Thunderbird 0.8 (X11/20041025) X-Accept-Language: en-us, en MIME-Version: 1.0 To: "Ronald F. Guilmette" References: <37501.1099507538@monkeys.com> In-Reply-To: <37501.1099507538@monkeys.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Virus-Scanned: Symantec AntiVirus Scan Engine cc: freebsd-questions@freebsd.org Subject: Re: Trying to understand flock() X-BeenThere: freebsd-questions@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: User questions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 04 Nov 2004 02:49:48 -0000 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 >#include >#include >#include >#include >#include > >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@freebsd.org mailing list >http://lists.freebsd.org/mailman/listinfo/freebsd-questions >To unsubscribe, send any mail to "freebsd-questions-unsubscribe@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 (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