Marvin Humphrey wrote:
On Tue, Dec 22, 2009 at 09:03:42PM -0800, Joshua ben Jore wrote:
On Tue, Dec 22, 2009 at 4:29 PM, Michael G Schwern <schw...@pobox.com> wrote:
A little experimentation with a small disk image shows that close() will
error if there's no disk left.  No need to check every print.  And a close()
You have to check every print. Most prints will just extend the buffer
but some prints will flush the buffer and return a real
success/failure.

But when print() or flush() fails, doesn't that put the filehandle into a
state where close() will always fail?
From the perldocs for close():

     Closes the file or pipe associated with the file handle, flushes the IO
     buffers, and closes the system file descriptor.  Returns true if those
     operations have succeeded and if no error was reported by any PerlIO
     layer.

If flushing the IO buffers fails once because the disk is full, I don't expect
that it would succeed in the future, right?

I've been using the technique of skipping checks on print() but checking
close() for a while now.  Maybe I've been lucky, but it seems to have been
pretty successful at detecting disk-full conditions.  The only downside is
that you don't know as soon as it happens -- you only know when you close() --
but depending on how your program is structured, that's usually not a problem.

That's my thinking exactly. If there is a set of conditions where the buffers line up with the stars, that's ok. The next close will fail. Really all we care here is that "you're out of disk" shows up somewhere in the report. The cost of covering that edge case is not worth the benefit.


--
94. Crucifixes do not ward off officers, and I should not test that.
    -- The 213 Things Skippy Is No Longer Allowed To Do In The U.S. Army
           http://skippyslist.com/list/

Reply via email to