# IO#gets raise IOError when not writable

**URL:** <https://www.ruby-forum.com/t/io-gets-raise-ioerror-when-not-writable/127583>\
**Category:** Development\
**Created:** [January 30, 2008, 3:48pm UTC](https://www.ruby-forum.com/t/io-gets-raise-ioerror-when-not-writable/127583 "2008-01-30T15:48:24Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![sheepman](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/d07c76/32.png) [@sheepman](https://www.ruby-forum.com/u/sheepman)\
**Post date:** [January 30, 2008, 3:48pm UTC](https://www.ruby-forum.com/t/io-gets-raise-ioerror-when-not-writable/127583/1 "2008-01-30T15:48:24Z")

</div>

e$B$3$s$K$A$Oe(B sheepman e$B$G$9!#e(B

e$B0J2\<$N$h$&$K%Q%$%W$re(B IO#close\_write e$B$9$k$He(B IO#gets  
e$B$G%(%i!\<$K$J$j$^$9!#e(B

$ cat t.rb  
io = IO.popen(“cat”, “r+”)  
io.puts(“foo”)  
io.close\_write  
p io.gets

$ ruby-1.8 -v t.rb  
ruby 1.8.6 (2007-12-02 patchlevel 5000) [i686-linux]  
“foo\n”

$ ruby-1.9 -v t.rb  
ruby 1.9.0 (2008-01-30 revision 15239) [i686-linux]  
t.rb:4:in `gets': closed stream (IOError) from t.rb:4:in`’

---

<div class="post-metadata">

**Author:** ![sheepman](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/d07c76/32.png) [@sheepman](https://www.ruby-forum.com/u/sheepman)\
**Post date:** [January 30, 2008, 4:45pm UTC](https://www.ruby-forum.com/t/io-gets-raise-ioerror-when-not-writable/127583/2 "2008-01-30T16:45:51Z")

</div>

e$B$J$+$@$G$9!#e(B

At Wed, 30 Jan 2008 23:47:30 +0900,  
sheepman wrote in [ruby-dev:33532]:

> e$B0J2\<$N$h$&$K%Q%$%W$re(B IO#close\_write e$B$9$k$He(B IO#gets e$B$G%(%i!\<$K$J$j$^$9!#e(B

duplexe$B$5$l$?=q$-9~$\_MQ$Ne(BIOe$B$,e(Bclosee$B$5$l$?$^$^;D$C$F$$$k$?$a$G$9$M!#e(B

# Index: io.c

— io.c (revision 15334)  
+++ io.c (working copy)  
@@ -2785,5 +2785,12 @@ rb\_io\_close\_read(VALUE io)  
write\_io = GetWriteIO(io);  
if (io != write\_io) {

- rb\_io\_t \*wfptr;  
fptr\_finalize(fptr, Qfalse);

- GetOpenFile(write\_io, wfptr);

- if (fptr-\>refcnt \< LONG\_MAX) {

- 

```
 wfptr->refcnt++;

```

- 

```
 RFILE(io)->fptr = wfptr;

```

- 

```
 rb_io_fptr_finalize(fptr);

```

- }  
return Qnil;  
}  
@@ -2818,10 +2825,11 @@ rb\_io\_close\_write(VALUE io)  
{  
rb\_io\_t \*fptr;

- VALUE write\_io;

- io = GetWriteIO(io);
- GetOpenFile(io, fptr);

- write\_io = GetWriteIO(io);
- GetOpenFile(write\_io, fptr);  
if (is\_socket(fptr-\>fd, fptr-\>path)) {  
#ifndef SHUT\_WR  
@@ -2832,5 +2840,5 @@ rb\_io\_close\_write(VALUE io)  
fptr-\>mode &= ~FMODE\_WRITABLE;  
if (!(fptr-\>mode & FMODE\_READABLE))

- 

```
       return rb_io_close(io);

```

- 

```
 return rb_io_close(write_io);
   return Qnil;

```

}  
@@ -2839,5 +2847,12 @@ rb\_io\_close\_write(VALUE io)  
rb\_raise(rb\_eIOError, “closing non-duplex IO for writing”);  
}

- return rb\_io\_close(io);

- 
- rb\_io\_close(write\_io);
- if (io != write\_io) {
- GetOpenFile(io, fptr);
- fptr-\>tied\_io\_for\_writing = 0;
- fptr-\>mode &= ~FMODE\_DUPLEX;
- }
- return Qnil;  
}

---

<div class="post-metadata">

**Author:** ![sheepman](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/d07c76/32.png) [@sheepman](https://www.ruby-forum.com/u/sheepman)\
**Post date:** [January 30, 2008, 6:24pm UTC](https://www.ruby-forum.com/t/io-gets-raise-ioerror-when-not-writable/127583/3 "2008-01-30T18:24:58Z")

</div>

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:33537] Re: IO#gets raise IOError when not  
writable”  
on Thu, 31 Jan 2008 00:45:11 +0900, Nobuyoshi N.  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) writes:

|At Wed, 30 Jan 2008 23:47:30 +0900,  
|sheepman wrote in [ruby-dev:33532]:  
|\> e$B0J2\<$N$h$&$K%Q%$%W$re(B IO#close\_write e$B$9$k$He(B IO#gets e$B$G%(%i!\<$K$J$j$^$9!#e(B  
|  
|duplexe$B$5$l$?=q$-9~$\_MQ$Ne(BIOe$B$,e(Bclosee$B$5$l$?$^$^;D$C$F$$$k$?$a$G$9$M!#e(B

e$B%3%\_%C%H$7$F$/$@$5$$!#e(B
