public Method

IO.close_write

ios.close_write    nil

Closes the write end of a duplex I/O stream (i.e., one that contains both a read and a write stream, such as a pipe). Will raise an IOError if the stream is not duplexed.

f = IO.popen("/bin/sh","r+")
f.close_write
f.print "nowhere"

produces:

prog.rb:3:in `write': not opened for writing (IOError)
 from prog.rb:3:in `print'
 from prog.rb:3

Source Code

/*
*  call-seq:
*     ios.close_write   => nil
*  
*  Closes the write end of a duplex I/O stream (i.e., one that contains
*  both a read and a write stream, such as a pipe). Will raise an
*  <code>IOError</code> if the stream is not duplexed.
*     
*     f = IO.popen("/bin/sh","r+")
*     f.close_write
*     f.print "nowhere"
*     
*  <em>produces:</em>
*     
*     prog.rb:3:in `write': not opened for writing (IOError)
*      from prog.rb:3:in `print'
*      from prog.rb:3
*/

static VALUE
rb_io_close_write(io)
   VALUE io;
{
   OpenFile *fptr;
   int n;

   if (rb_safe_level() >= 4 && !OBJ_TAINTED(io)) {
       rb_raise(rb_eSecurityError, "Insecure: can't close");
   }
   GetOpenFile(io, fptr);
   if (fptr->f2 == 0 && (fptr->mode & FMODE_READABLE)) {
       rb_raise(rb_eIOError, "closing non-duplex IO for writing");
   }
   if (fptr->f2 == 0) {
       return rb_io_close(io);
   }
   n = fclose(fptr->f2);
   fptr->f2 = 0;
   fptr->mode &= ~FMODE_WRITABLE;
   if (n != 0) rb_sys_fail(fptr->path);

   return Qnil;
}
Comments

Have your say
Please use Textile formatting (click here for a cheat sheet). Use <code/> and <pre/> for code samples.
Click here to login with OpenID to to post comments.