From: Brian Candler Date: 2007-03-08T18:19:17+09:00 Subject: Re: extension in c, close file when script ends, rb_io_fptr_finalize On Thu, Mar 08, 2007 at 04:55:11PM +0900, Alexander Fleck wrote: > I wrote an extension that uses a file to handle an external device. The > initialize method opens the file and it then is permanently open. I don' t > want to open and close it every time I write to it. > > I wondered how to finalize the object or to close the file when my script > ends. Currently the file keeps open and I have an open unused device. I'd recommend you copy the way that Ruby's File class does it. (1) Provide a 'close' method on your object, for the user to be able to explicitly close it when needed. (2) Provide a block-based method, which does an open / yield / close sequence File.open("/etc/passwd") do |f| puts f.read end # file is now closed at this point (preferred implementation is to use begin ... ensure .. end, so that the close is called even if an exception occurs when the yield is called) (3) Let the files close themselves when the program exits. > I stumbled over the function 'rb_io_fptr_finalize', but I didn' t find a > real reference which tells me if that' s what I searched for or not. As I understand it, finalisers are called when the object is garbage-collected. However there's not guarantee that an object will be garbage-collected at any time before the program exits (and not even then, if the user calls 'exit!') However, if it's just a file, the operating system will close the file when the program exits anyway. B.