[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[ale] Only one process
On 06/04/2010 09:44 PM, JK wrote:
> I wrote:
> > You really must have a "create-file-only-if-it-doesn't-already-exist"
> > operation in order to make this work, and flock(1) is the first
> To clarify: this is perfectly possible in a C program or whatever,
In C this is open(..., O_EXCL|O_CREAT), right?
Since the OP's script is in Perl, can't he use these same modes? Replace
the if(-f $pid_file) test with an attempt to create it.
sysopen(..., O_EXCL|O_CREAT) or die "File already exists\n";
That just worked in a simple test I ran. According to the documentation
it's no good if NFS is involved.
When used with O_CREAT, if the file already exists it is an error and
the open will fail. In this context, a symbolic link exists, regardless
of where its points to. O_EXCL is broken on NFS file systems, programs
which rely on it for performing locking tasks will contain a race
condition. The solution for performing atomic file locking using a
lockfile is to create a unique file on the same fs (e.g.,
incorporating hostname and pid), use link(2) to make a link to the
lockfile. If link() returns 0, the lock is successful. Otherwise, use
stat(2) on the unique file to check if its link count has increased to
2, in which case the lock is also successful.
All the best,