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


in reply to Re: Unix rename behaviour
in thread Unix rename behaviour

True, but I think the OP meant "cp" and not "mv" when refering to the rename(?) command. Although the cp(1) command will create a new inode, the already opened filehandles are pointing to older inodes.

Replies are listed 'Best First'.
Re^3: Unix rename behaviour
by Anonymous Monk on May 03, 2006 at 09:46 UTC
    Well, he meant "rename" when he said "rename"?! (it's linked to perl rename)

    -> Code should look like this

    $ cat foo.pl #!/usr/bin/perl -w ################## open(OUT,">testfileA"); print OUT "This is testfileA\n"; close(OUT); open(OUT,">testfileB"); print OUT "This is testfileB\n"; close(OUT); open(IN,"/tmp/testfileA"); rename ("testfileB", "testfileA"); print <IN>; close IN;

    Yields:
    $ ./foo.pl readline() on closed filehandle IN at ./foo.pl line 15.
    So the answer is "neither - rename closes the filehandle". I.
      So the answer is "neither - rename closes the filehandle".

      I think you missed the bit about "... two concurrent (Perl) processes ..." and "... when the second process next reads via it's open handle ..."

      A better test would be

      #!/usr/bin/perl use strict; use warnings; open OUT, '>', 'junk.1' or die $!; print OUT 'X'x 20 . "$_\n" for 1 .. 20; close OUT; open OUT, '>', 'junk.2' or die $!; print OUT 'Y'x 20 . "$_\n" for 1 .. 20; close OUT; open IO, '+<', 'junk.1' or die $!; seek IO, 0, 0; print scalar <IO>; system $^X, '-le', q[ print rename( 'junk.2', 'junk.1' ) ? 'worked' : +'failed']; print scalar <IO>; seek IO, 0, 0; print scalar <IO>; close IO; unlink 'junk.1';

      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      Lingua non convalesco, consenesco et abolesco. -- Rule 1 has a caveat! -- Who broke the cabal?
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.