Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer
 
PerlMonks  

Re^4: Bad file descriptor when trying to close file handle

by ikegami (Patriarch)
on Mar 03, 2022 at 15:16 UTC ( [id://11141803]=note: print w/replies, xml ) Need Help??


in reply to Re^3: Bad file descriptor when trying to close file handle
in thread Bad file descriptor when trying to close file handle

well kind of, printing to an unlinked file in ">>" mode seems to do nothing, but no error message either.

It might seem to you that it does nothing, but that's not the case. It does what I said it does: It writes to the file as it always does.

Open the file twice, once for reading and once for writing. Then delete the directory entry you used to open the file, then write to it, then read from it. You'll see it's there.

  • Comment on Re^4: Bad file descriptor when trying to close file handle

Replies are listed 'Best First'.
Re^5: Bad file descriptor when trying to close file handle
by ikegami (Patriarch) on Mar 03, 2022 at 15:27 UTC

    A bit more on this.

    Files exists independently of directory entries in unix. Think of them as being referenced-counted. They exist as long as they are referenced by a directory entry or by a file handle.

    This means you can have "anonymous files". perl -i uses this (which is why it doesn't work on Windows without an extension). File::Temp creates these by default.

    ls -l even shows how many times a file is referenced by a directory entry (second column). For plain files, it's usually one. For directories, it should be more than one.

    $ ls -ld . .. .bash* bin usr drwxr-xr-x 10 ikegami ikegami 4096 Feb 19 23:53 ./ drwxr-xr-x 3 root root 4096 Dec 10 21:14 ../ -rw------- 1 ikegami ikegami 163 Jan 3 02:07 .bash_logout -rw------- 1 ikegami ikegami 2318 Jan 3 02:07 .bashrc -rw------- 1 ikegami ikegami 0 Jan 3 02:07 .bashrc_extra drwx------ 2 ikegami ikegami 4096 Feb 14 12:13 bin/ drwx------ 3 ikegami ikegami 4096 Jan 24 15:39 usr/

    See how .. is referenced by three directory entries? Those are /home, /home/. and /home/ikegami/..

    See how . is referenced by ten directory entries? Those are /home/ikegami, /home/ikegami/., /home/ikegami/bin/.., /home/ikegami/usr/.., etc.

Re^5: Bad file descriptor when trying to close file handle
by LanX (Saint) on Mar 03, 2022 at 15:25 UTC
    not sure what you mean, I globed the directory after writing to an unlinked file and it was gone.

    Probably that file and inode still exist without association to a dir, but how would I recreate it into the dir?

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    Wikisyntax for the Monastery

      The directory entry is gone, yes. Writing to a file doesn't create directory entries.

      I didn't mention glob at all. Did you try the steps I described? The file is only gone once no directory and no file handles reference it. Also, see the post I just made in parallel to yours.

      $ perl -Mv5.10 -e' open my $o_fh, ">", "a" or die $!; open my $i_fh, "<", "a" or die $!; unlink "a" or die $!; print $o_fh "abc\n" or die $!; $o_fh->flush(); chomp( my $line = <$i_fh> ); say "<$line>"; ' <abc>
        > See the post I just made in parallel to yours.

        I know about inodes

        But the question remains:

        How can I revive/move an "invisible" file into the directory?

        link doesn't seem to accept FHs.

        use strict; use warnings; use Data::Dump qw/ddx/; use autodie; my $dir = "/tmp"; my $file = "$dir/tst_unlink"; open my $fh, ">>", $file; print $fh "ENTRY ".__LINE__; ddx <$file*>; unlink $file; print $fh "ENTRY ".__LINE__; ddx <$file*>; eval { link $fh, "${file}_new"; } or warn $@; eval { link $file, "${file}_new"; } or warn $@; ddx <$file*>; __DATA__
        OUTPUT:
        # open_unlink.pl:16: "/tmp/tst_unlink" # open_unlink.pl:22: () Can't link($fh, '/tmp/tst_unlink_new'): Datei oder Verzeichnis nicht g +efunden at ./open_unlink.pl line 24 Can't link('/tmp/tst_unlink', '/tmp/tst_unlink_new'): Datei oder Verze +ichnis nicht gefunden at ./open_unlink.pl line 26 # open_unlink.pl:29: ()

        Cheers Rolf
        (addicted to the Perl Programming Language :)
        Wikisyntax for the Monastery

        PS: FWIW: I was guessing, I can't run a full diagnosis for every fuzzy bug question, even after reading it thrice.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://11141803]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others romping around the Monastery: (2)
As of 2024-04-16 19:55 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found