Issue #11218 has been updated by Yukihiro Matsumoto.


追加OKです。シンボルで指定するよりはFile::SHARE_DELETE(UNIXでは0)で指定したほうが良さそうな気がします。
シンボル指定を残すかどうかはお任せします。

Matz.


----------------------------------------
Feature #11218: File.open FILE_SHARE_DELETE
https://bugs.ruby-lang.org/issues/11218#change-52848

* Author: Yui NARUSE
* Status: Open
* Priority: Normal
* Assignee: 
----------------------------------------
fluentdという、OSSのログコレクタがあるのですが、これには`in_tail`プラグインというものがあります。
これは、ログファイルを監視して、ログがファイルに追記されたらその分を読み込んでJSONにして他に流します。

このログファイルはfluentdではない他の誰か、ApacheだったりRailsだったりします。
この手のログファイルを書いていく流儀はいくつかありますが、ご存じの通りRailsやApacheは基本的に特定のパスにひたすら追記し続け、
それでは肥大化しすぎるのでlogrotateなどと組み合わせて適宜rotateしていく運用が一般的でしょう。
つまり、ログファイルをrenameし、ApacheやRailsなどにsignalで再起動して新しいファイルに書くわけです。

ところで、Windowsは誰かが開いているファイルをrenameすることはできないので通常このようなことは出来ません。
やるにはファイルを開く際の`CreateFile`に`FILE_SHARE_DELETE`フラッグをつけてやる必要があります。
そんなことやってる人いるのかというご指摘もあるとは思いますが、やる人はやっているようです。
https://issues.apache.org/jira/browse/HADOOP-8564

さて、RubyのWindowsの`open(2)`ラッパー、`rb_w32_open`/`rb_w32_wopen`はテキストモードの場合は`_open`/`_wopen`を使っており、
これはおいておくとして、バイナリモードの場合は`CreateFile`を使っているものの現状`FILE_SHARE_DELETE`は渡していないので、
なんらかの手段で`FILE_SHARE_DELETE`を付けられるようになりませんか。

---Files--------------------------------
share_delete.patch (2.9 KB)


-- 
https://bugs.ruby-lang.org/