Bug #3198

O_APPEND for redirect fd is ignored on windows

Added by wanabe (_ wanabe) about 2 years ago. Updated 11 months ago.

[ruby-dev:41054]
Status:Rejected Start date:04/25/2010
Priority:Normal Due date:
Assignee:usa (Usaku NAKAMURA) % Done:

0%

Category:core
Target version:2.0.0
ruby -v:ruby 1.9.2dev (2010-04-24 trunk 22784) [i386-mingw32]

Description

Windows7 で、リダイレクト用にファイルをオープンする時
O_APPEND を渡しても無視されます。

$ cat test.rb
fname = "tmp.out"
File.delete fname if File.exist? fname
5.times do
  system("echo a", STDOUT=>[fname, File::WRONLY|File::CREAT|File::APPEND, 0644])
end
p IO.read(fname)

$ ruby -v test.rb
ruby 1.9.2dev (2010-04-24 trunk 22784) [i386-mingw32]
"a\n"

以下のようなパッチを書きました。特に反対がなければコミットさせて頂きます。
rb_w32_open で処理することも考えましたが、おそらくリダイレクト以外では
O_APPEND が効くのではないかと思うので、とりあえず process.c で処理しました。

Index: process.c
===================================================================
--- process.c (revision 27483)
+++ process.c (working copy)
@@ -2094,6 +2094,11 @@ run_exec_open(VALUE ary, VALUE save, char *errmsg, size_t errmsg_buflen)
             ERRMSG("open");
             return -1;
         }
+#if defined(_WIN32)
+	if (flags & O_APPEND) {
+	    lseek(fd2, 0, SEEK_END);
+	}
+#endif
         while (i < RARRAY_LEN(ary) &&
                (elt = RARRAY_PTR(ary)[i], RARRAY_PTR(elt)[1] == param)) {
             fd = FIX2INT(RARRAY_PTR(elt)[0]);

Related issues

related to ruby-trunk - Bug #1605: TestProcess failure Closed 06/11/2009

History

Updated by kosaki (Motohiro KOSAKI) about 2 years ago

> Bug #3198: O_APPEND for redirect fd is ignored on windows
> http://redmine.ruby-lang.org/issues/show/3198
>
> 起票者: _ wanabe
> ステータス: Open, 優先度: Normal
> ruby -v: ruby 1.9.2dev (2010-04-24 trunk 22784) [i386-mingw32]
>
> Windows7 で、リダイレクト用にファイルをオープンする時
> O_APPEND を渡しても無視されます。

根本原因はなんなのでしょうか?


> +#if defined(_WIN32)
> +       if (flags & O_APPEND) {
> +           lseek(fd2, 0, SEEK_END);
> +       }
> +#endif

レビューしました。lseek(SEEK_END)だと他のプロセスと競合した場合に
同じ事が起きますが、これは問題ない?

Updated by usa (Usaku NAKAMURA) about 2 years ago

こんにちは、なかむら(う)です。

In message "[ruby-dev:41055] Re: [Bug #3198] O_APPEND for redirect fd is ignored  on windows"
    on Apr.25,2010 13:20:15, <kosaki.motohiro@gmail.com> wrote:
> > Windows7 で、リダイレクト用にファイルをオープンする時
> > O_APPEND を渡しても無視されます。
> 
> 根本原因はなんなのでしょうか?

fdに付随したフラグは子プロセスに受け継がれません。
だってファイルデスクリプタなんて概念Windows自体にはないんだも
ん。


> > +#if defined(_WIN32)
> > +       if (flags & O_APPEND) {
> > +           lseek(fd2, 0, SEEK_END);
> > +       }
> > +#endif
> 
> レビューしました。lseek(SEEK_END)だと他のプロセスと競合した場合に
> 同じ事が起きますが、これは問題ない?

避け得ないからいいんじゃないですかね。


それでは。
-- 
U.Nakamura <usa@garbagecollect.jp>

Updated by kosaki (Motohiro KOSAKI) about 2 years ago

> こんにちは、なかむら(う)です。
>
> In message "[ruby-dev:41055] Re: [Bug #3198] O_APPEND for redirect fd is ignored  on windows"
>    on Apr.25,2010 13:20:15, <kosaki.motohiro@gmail.com> wrote:
>> > Windows7 で、リダイレクト用にファイルをオープンする時
>> > O_APPEND を渡しても無視されます。
>>
>> 根本原因はなんなのでしょうか?
>
> fdに付随したフラグは子プロセスに受け継がれません。
> だってファイルデスクリプタなんて概念Windows自体にはないんだも
> ん。

ああ、なるほど。なっとく。すいません空気読めてませんでした
ならしょうがないですね。

Updated by wanabe (_ wanabe) about 2 years ago

  • Category set to core
  • Target version set to 2.0.0
レビューおよび補足ありがとうございます。
その後、このパッチでは書き込み前に既にポインタが末尾に移動している状態になり
読み込み時に O_APPEND の動作と異なってしまいよくない、ということがわかりましたので
上のパッチは取り下げます。

また、1.9.2 前に早急に直すべきとも思えませんので判別のために
ターゲットを 1.9.x にしておきます。

Updated by naruse (Yui NARUSE) 11 months ago

  • Status changed from Open to Assigned
  • Assignee set to arton (Akio Tajima)
決定の問題だと思うので、決めてください

Updated by usa (Usaku NAKAMURA) 11 months ago

  • Status changed from Assigned to Rejected
  • Assignee changed from arton (Akio Tajima) to usa (Usaku NAKAMURA)
なぜかartonさんに割り当てられてるけど勝手に分捕ります。 で、「仕様」ということで今回はreject。 なんか新しい解決策を誰かが思いついたらまた考えましょう。 # 子プロセスをsuspend状態で作ってremote thread注入して、というのが # 今突然ひらめいたけどもちろんやらない。

Also available in: Atom PDF