http://www.perlmonks.org?node_id=885359


in reply to locking over the network

If windows supports hard links you could try something like this.

#!/usr/bin/perl use strict; use warnings; open my $fh, ">", "mylock.$$" or die "open mylock.$$: $!"; sleep 2 until get_lock(); print "locked> "; <>; unlink "mylock"; # releases the lock unlink "mylock.$$"; # just cleaning up sub get_lock { link "mylock.$$", "mylock" and return 1; return (stat "mylock.$$" )[3] == 2; }

The above is based on the discussion of portably locking with link(2) as found on the Linux man page for open(2) in the O_EXCL discussion.

Edit: added comments because one unlink matters and the other doesn't.

Replies are listed 'Best First'.
Re^2: locking over the network
by rovf (Priest) on Feb 01, 2011 at 10:14 UTC
    If windows supports hard links ...
    To be honest, I thought that the concept of hard links works only within a filesystem. I don't know how Windows does it, but with, for example, Samba, you don't have a node number where you could hard-link to, do you?

    -- 
    Ronald Fischer <ynnor@mm.st>
      To be honest, I thought that the concept of hard links works only within a filesystem.

      Yes, that's my understanding as well, which is why my example does its work in the current directory.

      I don't know how Windows does it, but with, for example, Samba, you don't have a node number where you could hard-link to, do you?

      smbclient(1) seems to support hard links but I really can't say whether perl's link command works on a samba mount.

        Perl's link works on an SMB mount of an NTFS volume (for non-ancient versions of Perl and non-ancient Windows operating systems).

        I'd be more worried about getting the link count. That is a surprisingly complex and expensive operation under NTFS, as I understand it. But simplistic testing shows that it works okay using native Win32 Perl and Cygwin Perl to a NTFS volume over SMB.

        - tye