[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.

use Fcntl;
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,
Brian Pitts