# IO.popen("echo a") clear O\_APPEND of other fds

**URL:** <https://www.ruby-forum.com/t/io-popen-echo-a-clear-o-append-of-other-fds/96848>\
**Category:** Development\
**Created:** [July 2, 2006, 4:17pm UTC](https://www.ruby-forum.com/t/io-popen-echo-a-clear-o-append-of-other-fds/96848 "2006-07-02T16:17:06Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [July 2, 2006, 4:17pm UTC](https://www.ruby-forum.com/t/io-popen-echo-a-clear-o-append-of-other-fds/96848/1 "2006-07-02T16:17:06Z")

</div>

e$B0J2\<$N$h$&$K!"e(BIO.popen(“echo a”) e$B$,4X78$J$$B\>$Ne(B IO e$B$Ne(B  
O\_APPEND e$B$r\>C$7$F$7$^$&$h$&$G$9!#e(B

% ./ruby -rfcntl -ve ’  
p File::APPEND.to\_s(16)  
open(“z”, File::RDWR|File::APPEND|File::TRUNC|File::CREAT)  
{|f|  
f.print " "  
f.rewind; f.print “x”; f.rewind; p f.read  
f.rewind; f.print “x”; f.rewind; p f.read  
f.rewind; f.print “x”; f.rewind; p f.read  
p f.fcntl(Fcntl::F\_GETFL).to\_s(16)  
IO.popen(“echo a”) {|q| q.read }  
p f.fcntl(Fcntl::F\_GETFL).to\_s(16)  
f.rewind; f.print “x”; f.rewind; p f.read  
}’  
ruby 1.9.0 (2006-07-02) [i686-linux]  
“400”  
" x"  
" xx"  
" xxx"  
“8402”  
“8002”  
“x xxx”

e$B2?2s$+e(B f.rewind; f.print “x” e$B$7$F$$$^$9$,!"e(Bf e$B$K$Oe(B  
O\_APPEND  
e$B$,$D$$$F$$$k$N$Ge(B write e$B$7$?$b$N$O%U%!%$%k$NKvHx$K=q$-9~$^$le(B  
e$B$k$O$:$G$9!#e(B

e$B\<B:]!"e(BIO.popen(“echo a”)  
e$B$9$k$^$G$O$=$&$J$C$F$$$k$o$1$G$9$,!“e(B  
IO.popen(“echo a”) e$B$7$?8e$Ne(B 1e$B2s$O$=$&$J$C$F$\*$i$:!”%U%!%$%ke(B  
e$B$N:G=i$K=q$-9~$^$l$F$$$^$9!#e(B

e$B$3$l$O$I$&$be(B IO.popen(“echo a”) e$B$,e(B f e$B$Ne(B O\_APPEND  
(0x400) e$B$re(B  
e$B\>C$7$F$7$^$&$?$a$J$N$G$9$,!"$3$l$OJQ$G$O$J$$$G$7$g$&$+!#e(B

---

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [July 2, 2006, 6:45pm UTC](https://www.ruby-forum.com/t/io-popen-echo-a-clear-o-append-of-other-fds/96848/2 "2006-07-02T18:45:25Z")

</div>

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

At Sun, 2 Jul 2006 23:13:48 +0900,  
Tanaka A. wrote in [ruby-dev:28924]:

> e$B0J2\<$N$h$&$K!"e(BIO.popen(“echo a”) e$B$,4X78$J$$B\>$Ne(B IO e$B$Ne(B  
> O\_APPEND e$B$r\>C$7$F$7$^$&$h$&$G$9!#e(B

3e$B0J\>e$Ne(Bfde$B$Ke(BCLOEXECe$B%U%i%0$r%;%C%H$9$k$H$-$K!"85$N%U%i%0$r8+$F$$e(B  
e$B$^$;$s$G$7$?!#$b$7$+$7$?$iC1$Ke(Bclosee$B$9$k$@$1$N$[$&$,$$$$$N$+$b$7e(B  
e$B$l$^$;$s!#e(B

# Index: io.c

RCS file: /cvs/ruby/src/ruby/io.c,v  
retrieving revision 1.411  
diff -p -U 2 -r1.411 io.c  
— io.c 2 Jul 2006 02:25:11 -0000 1.411  
+++ io.c 2 Jul 2006 16:40:22 -0000  
@@ -2952,5 +2952,7 @@ popen\_exec(void \*pp)  
for (fd = 3; fd \< NOFILE; fd++) {  
#ifdef FD\_CLOEXEC

- fcntl(fd, F\_SETFL, FD\_CLOEXEC);

- int flag = fcntl(fd, F\_GETFL);
- if ((flag == -1) || (flag & FD\_CLOEXEC)) continue;
- fcntl(fd, F\_SETFL, flag | FD\_CLOEXEC);  
#else  
close(fd);

---

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [July 2, 2006, 7:00pm UTC](https://www.ruby-forum.com/t/io-popen-echo-a-clear-o-append-of-other-fds/96848/3 "2006-07-02T19:00:58Z")

</div>

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

In message “Re: [ruby-dev:28930] Re: IO.popen(“echo a”) clear O\_APPEND  
of other fds.”  
on Mon, 3 Jul 2006 01:44:02 +0900, removed\_email\_address@domain.invalid writes:

|At Sun, 2 Jul 2006 23:13:48 +0900,  
|Tanaka A. wrote in [ruby-dev:28924]:  
|\> e$B0J2\<$N$h$&$K!"e(BIO.popen(“echo a”) e$B$,4X78$J$$B\>$Ne(B IO e$B$Ne(B  
|\> O\_APPEND e$B$r\>C$7$F$7$^$&$h$&$G$9!#e(B  
|  
|3e$B0J\>e$Ne(Bfde$B$Ke(BCLOEXECe$B%U%i%0$r%;%C%H$9$k$H$-$K!"85$N%U%i%0$r8+$F$$e(B  
|e$B$^$;$s$G$7$?!#$b$7$+$7$?$iC1$Ke(Bclosee$B$9$k$@$1$N$[$&$,$$$$$N$+$b$7e(B  
|e$B$l$^$;$s!#e(B

e$B$9$0$Ke(Bexece$B$9$k$o$1$G$9$+$i$M$(!#e(Bclosee$B$7$^$7$g$&$+!#e(B

e$B$7$+$7!"$=$l$O$=$l$H$7$F!"$$$A$$$Ae(BGETFLe$B$7$F$+$i$G$J$$$H$^$He(B  
e$B$b$Ke(BSETFLe$B$G$-$J$$;EMM$O%G%-$,0-$$$J!#e(B

---

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [July 2, 2006, 7:22pm UTC](https://www.ruby-forum.com/t/io-popen-echo-a-clear-o-append-of-other-fds/96848/4 "2006-07-02T19:22:19Z")

</div>

In article [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid),  
removed\_email\_address@domain.invalid writes:

> 3e$B0J\>e$Ne(Bfde$B$Ke(BCLOEXECe$B%U%i%0$r%;%C%H$9$k$H$-$K!"85$N%U%i%0$r8+$F$$e(B  
> e$B$^$;$s$G$7$?!#$b$7$+$7$?$iC1$Ke(Bclosee$B$9$k$@$1$N$[$&$,$$$$$N$+$b$7e(B  
> e$B$l$^$;$s!#e(B

e$B$($'$H!"e(BCLOEXEC e$B$Oe(B F\_SETFD e$B$G$Oe(B? F\_SETFL  
e$B$G$O$J$/!#e(B

e$B$H$3$m$G!"e(BF\_SETFD e$B$NBP\>]$G!“e(BCLOEXEC  
e$B0J30$K$J$K$+B8:\_$9$k%7%9e(B  
e$B%F%`$C$F$”$j$^$7$?$C$1e(B?

e$B$J$/$F$b$=$&$$$&$N$,B8:\_$9$k%7%9%F%`$,$I$3$+$Ke(B  
(e$B$b$7$/$O\>-Mhe(B)  
e$B$“$k$+$b$7$l$J$$$+$i85$N%U%i%0$r8+$k!”$H$$$&$N$O$^$C$?$/$b$Ce(B  
e$B$F@5$7$$$N$G$9$,!#e(B

---

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [July 3, 2006, 2:49am UTC](https://www.ruby-forum.com/t/io-popen-echo-a-clear-o-append-of-other-fds/96848/5 "2006-07-03T02:49:08Z")

</div>

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

At Mon, 3 Jul 2006 02:21:40 +0900,  
Tanaka A. wrote in [ruby-dev:28932]:

> e$B$($’$H!"e(BCLOEXEC e$B$Oe(B F\_SETFD e$B$G$Oe(B? F\_SETFL e$B$G$O$J$/!#e(B

e$B$&$O!#e(B

At Mon, 3 Jul 2006 01:58:42 +0900,  
Yukihiro M. wrote in [ruby-dev:28931]:

> e$B$9$0$Ke(Bexece$B$9$k$o$1$G$9$+$i$M$(!#e(Bclosee$B$7$^$7$g$&$+!#e(B

e$B$3$C$A$K$7$^$7$g$&!#e(B

> e$B$H$3$m$G!"e(BF\_SETFD e$B$NBP\>]$G!“e(BCLOEXEC e$B0J30$K$J$K$+B8:\_$9$k%7%9e(B  
> e$B%F%`$C$F$”$j$^$7$?$C$1e(B?

e$BJ9$$$?$3$H$O$J$$$G$9!#e(B

---

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [July 2, 2006, 7:34pm UTC](https://www.ruby-forum.com/t/io-popen-echo-a-clear-o-append-of-other-fds/96848/6 "2006-07-02T19:34:37Z")

</div>

In article [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid),  
Yukihiro M. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) writes:

> e$B$7$+$7!“$=$l$O$=$l$H$7$F!”$$$A$$$Ae(BGETFLe$B$7$F$+$i$G$J$$$H$^$He(B  
> e$B$b$Ke(BSETFLe$B$G$-$J$$;EMM$O%G%-$,0-$$$J!#e(B

e$B$3$N=PMh$N0-$5$re(B Ruby e$B%l%Y%k$G$I$&$K$+$9$k$?$a$Ke(B  
IO#file\_flags e$B$re(B GETFL,  
IO#file\_flags= e$B$re(B SETFL e$B$K$7$F!“e(B  
io.file\_flags |= File::NONBLOCK  
e$B$H$G$-$k$h$&$K$7$?$i$I$&$+!”$H9M$($?$3$H$O$"$j$^$9!#e(B

e$BF1MM$Ke(B  
IO#descriptor\_flags e$B$re(B GETFD,  
IO#descriptor\_flags= e$B$re(B SETFD e$B$K$7$F!“e(B  
io.descriptor\_flags |= Fcntl::FD\_CLOEXEC  
e$B$H=PMh$k$h$&$K$9$k!”$H$$$&$3$H$b9M$($i$l$^$9!#e(B

e$B$?$@!“e(BNONBLOCK e$B$K4X$7$F$O!“e(BGETFL/SETFL  
e$B$,4JC1$K$J$k$@$1$G$Oe(B  
e$B$[$H$s$ILdBj$,2r7h$7$J$$!”$H$$$&$3$H$G$_B"F~$j$K$7$F!"e(B  
IO#_\_nonblock e$B$r9M$($?$o$1$G$9$,!”$=$C$A$Oe(B (e$B$D$$$Ke(B)  
e$BJRIU$$$?e(B  
e$B$N$G!“e(BIO#file\_flags= e$B$r8!F$$9$k$N$b$”$j$+$b$7$l$^$;$s!#e(B

… e$B$H;W$C$F9M$($F$\_$k$H!“e(BIO#file\_flags e$B$,e(B Windows  
e$B$GF0$+$Je(B  
e$B$$$+$i%]!\<%?%S%j%F%#$KFq$”$j!"$+$J!#e(B

---

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [July 3, 2006, 4:11am UTC](https://www.ruby-forum.com/t/io-popen-echo-a-clear-o-append-of-other-fds/96848/7 "2006-07-03T04:11:30Z")

</div>

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

At Mon, 3 Jul 2006 02:34:14 +0900,  
Tanaka A. wrote in [ruby-dev:28933]:

> e$B$H=PMh$k$h$&$K$9$k!"$H$$$&$3$H$b9M$($i$l$^$9!#e(B  
> IO#close\_on\_exec e$B$N$h$&$K8DJL$K$7$?$[$&$,!“e(Bfile\_flagse$B$He(B  
> descriptor\_flagse$B$N$I$C$A$@$C$1!”$H$+G:$^$:$K$9$`$s$8$c$J$$$G$7$ge(B  
> e$B$&$+!#$=$l$H$bAa$9$.$kBUBF2=e(B?

> … e$B$H;W$C$F9M$($F$\_$k$H!“e(BIO#file\_flags e$B$,e(B Windows e$B$GF0$+$Je(B  
> e$B$$$+$i%]!\<%?%S%j%F%#$KFq$”$j!"$+$J!#e(B

e$B$J$1$j$c$J$$$GL$Dj5A$G$$$$$s$G$O!#e(B

- io.c (rb\_io\_cloexec\_get, rb\_io\_cloexec\_set): new methods, get/set  
FD\_CLOEXEC flag.

# Index: io.c

RCS file: /cvs/ruby/src/ruby/io.c,v  
retrieving revision 1.411  
diff -p -u -2 -r1.411 io.c  
— io.c 2 Jul 2006 02:25:11 -0000 1.411  
+++ io.c 3 Jul 2006 01:17:08 -0000  
@@ -2693,4 +2693,56 @@ rb\_io\_modenum\_mode(int flags)  
}

+#ifdef FD\_CLOEXEC  
+/\*

- 
  - call-seq:

- 
  - 

```
ios.close_on_exec => true/false

```

- 
  - 

- 
  - Returns true if _ios_ will be closed on +exec+.

- 
  - 

- 
  - def fd(io)

- 
  - 

```
 path = "/proc/self/fd/#{io.fileno.to_s}"

```

- 
  - 

```
 system("readlink", path) or puts "#{path} is not opened"

```

- 
  - end

- 
  - 

- 
  - f = open("/dev/null")

- 
  - fd(f) # =\> /dev/null

- 
  - f.close\_on\_exec = true

- 
  - fd(f) # =\> /proc/self/fd/3 is not opened

- \*/
- 

+static VALUE  
+rb\_io\_cloexec\_get(VALUE io)  
+{

- OpenFile \*fptr;
- int flag;
- 
- GetOpenFile(io, fptr);
- flag = fcntl(fptr-\>fd, F\_GETFD);
- if (flag == -1) rb\_sys\_fail(0);
- return (flag & FD\_CLOEXEC) ? Qtrue : Qfalse;  
+}
- 

+static VALUE  
+rb\_io\_cloexec\_set(VALUE io, VALUE val)  
+{

- OpenFile \*fptr;
- int oflag, flag;
- 
- GetOpenFile(io, fptr);
- flag = fcntl(fptr-\>fd, F\_GETFD);
- if (flag == -1) rb\_sys\_fail(0);
- oflag = flag;
- if (RTEST(val)) {
- flag |= FD\_CLOEXEC;
- }
- else {
- flag &= ~FD\_CLOEXEC;
- }
- if (oflag != flag && fcntl(fptr-\>fd, F\_SETFD, flag) == -1)
- rb\_sys\_fail(0);
- return (oflag & FD\_CLOEXEC) ? Qtrue : Qfalse;  
+}  
+#endif
- 

static int  
rb\_sysopen(char \*fname, int flags, unsigned int mode)  
@@ -5696,4 +5748,8 @@ Init\_IO(void)  
rb\_define\_method(rb\_cIO, “eof”, rb\_io\_eof, 0);  
rb\_define\_method(rb\_cIO, “eof?”, rb\_io\_eof, 0);  
+#ifdef FD\_CLOEXEC

- rb\_define\_method(rb\_cIO, “close\_on\_exec”, rb\_io\_cloexec\_get, 0);

- rb\_define\_method(rb\_cIO, “close\_on\_exec=”, rb\_io\_cloexec\_set, 1);  
+#endif

---

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [July 3, 2006, 4:39am UTC](https://www.ruby-forum.com/t/io-popen-echo-a-clear-o-append-of-other-fds/96848/8 "2006-07-03T04:39:04Z")

</div>

In article [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid),  
removed\_email\_address@domain.invalid writes:

> IO#close\_on\_exec e$B$N$h$&$K8DJL$K$7$?$[$&$,!“e(Bfile\_flagse$B$He(B  
> descriptor\_flagse$B$N$I$C$A$@$C$1!”$H$+G:$^$:$K$9$`$s$8$c$J$$$G$7$ge(B  
> e$B$&$+!#$=$l$H$bAa$9$.$kBUBF2=e(B?

e$BJ}8~$O$$$$$H;W$$$^$9!#e(B|= e$B$G5/$3$k0J2\<$NLdBj$b$J$$$G$9$7!#e(B

> > … e$B$H;W$C$F9M$($F$\_$k$H!“e(BIO#file\_flags e$B$,e(B Windows e$B$GF0$+$Je(B  
> > e$B$$$+$i%]!\<%?%S%j%F%#$KFq$”$j!"$+$J!#e(B
> 
> e$B$J$1$j$c$J$$$GL$Dj5A$G$$$$$s$G$O!#e(B

e$BL$Dj5A$de(B NotImplementedError e$B$K$J$C$F$k$H!"e(B|=  
e$B$,;H$($J$$$N$,e(B  
e$B$A$g$C$HLdBj$G$9!#e(B

% ruby -e ’  
class C  
def v  
raise NotImplementedError  
end  
def v=(x)  
end  
end  
C.new.v |= 1’  
-e:4:in `C#v’: NotImplementedError (NotImplementedError)  
from -e:9

e$B$J$N$G!“MQ0U$9$k$J$i8DJL$N$[$&$,$$$$$N$G$9$,!”$=$b$=$b%a%=%Ce(B  
e$B%I$rMQ0U$9$k$[$IIQHK$K;H$&%U%i%0$,$“$k$N$+!”$H$$$&E@$K5?Ld$,e(B  
e$B$"$j$^$9!#e(B

e$B8D?ME\*$J463P$H$7$F$O!“e(BO\_NONBLOCK e$B$,0lHV$h$/;H$o$l$k$H;W$&$se(B  
e$B$G$9$,!”$3$l$O$`$7$me(B (e$B%=%1%C%H$KBP$7$Fe(B)  
e$B%G%U%)%k%H$GIU$1$F$7e(B  
e$B$^$&$N$,$$$$$H;W$&$N$G%a%=%C%I$O:GA1$NJ}K!$G$OL5$$$H;W$$$^$9e(B  
e$B$7!“\<!$KNI$/;H$o$l$k$b$N$Oe(B FD\_CLOEXEC e$B$N$h$&$J5$$,$7$^$9$,!“e(B  
e$B$=$s$J$K;H$&$+$H$$$&$H!”$”$^$j$=$s$J5$$O$7$^$;$s!#e(B
