Project

General

Profile

Feature #9880

Dir#fileno

Added by akr (Akira Tanaka) over 5 years ago. Updated about 5 years ago.

Status:
Closed
Priority:
Normal
Target version:
[ruby-dev:48265]

Description

Dir#fileno を追加したいのですがどうでしょうか。

最近、fd を close せずに終わるテストを調べています。
そのために、テストの前後で、Dir.entries("/proc/#$$/fd") として、
fd が変化しているかどうか調べているのですが、
これには少し問題があります。

現在使われている fd のリストを得るために
Dir.entries("/proc/#{$$}/fd") とすると、
以下のようにひとつ余計なものが出てきます。

% ruby -ve '
system("ls /proc/#$$/fd")
p Dir.entries("/proc/#$$/fd")
system("ls /proc/#$$/fd")
'
ruby 2.2.0dev (2014-05-18 trunk 45984) [x86_64-linux]
0  1  2  3  4  5  6
[".", "..", "0", "1", "2", "3", "4", "5", "6", "7"]
0  1  2  3  4  5  6

前後の system("ls /proc/#$$/fd") では 6 までしかないのに、
Dir.entries では 7 まで出てきます。

ひとつ余計な fd が出てくる理由は Dir.entries 自身がひとつ fd を使っているからです。
内部的には opendir がひとつ fd を生成します。

この挙動のため、テストが close しなかった fd ではなく、
Dir.entries が内部で使う fd が報告されることがあります。

というわけで、opendir の fd を取り除きたいのですが、
この fd を Ruby レベルで得るメソッドがありません。

しかし、POSIX では dirfd() という関数があって、DIR 構造体から
fd を取り出せます。
(4.3BSD Reno にあって、POSIX 2008 に入ったものです。)

というわけで、Dir#fileno を加えるのはどうでしょうか。
これがあれば、以下のように、/proc/#$$/fd を読むための fd を取り除けます。

% ./ruby -ve '
system("ls /proc/#$$/fd")
p Dir.open("/proc/#$$/fd") {|d|
  a = []
  while fn = d.read
    a << fn
  end
  a - [d.fileno.to_s]
}
system("ls /proc/#$$/fd")
'
ruby 2.2.0dev (2014-05-29 trunk 46224) [x86_64-linux]
0  1  2  3  4  5  6
[".", "..", "0", "1", "2", "3", "4", "5", "6"]
0  1  2  3  4  5  6

名前は Dir#dirfd と Dir#fileno のどちらかだと思うのですが、
IO#fileno との一貫性による覚えやすさをとって
Dir#fileno がいいんじゃないかと思っています。

あと、dirfd がないときは NotImplementedError です。

どうでしょうか。


Files

dir-fileno.patch (1.51 KB) dir-fileno.patch akr (Akira Tanaka), 05/29/2014 11:36 AM

Associated revisions

Revision d03315d8
Added by akr (Akira Tanaka) about 5 years ago

  • configure.in (dirfd): Check function.

  • dir.c (dir_fileno): New method.
    [ruby-dev:48265] [Feature #9880]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@47387 b2dd03c8-39d4-4d8f-98ff-823fe69b080e

Revision 47387
Added by akr (Akira Tanaka) about 5 years ago

  • configure.in (dirfd): Check function.

  • dir.c (dir_fileno): New method.
    [ruby-dev:48265] [Feature #9880]

Revision 47387
Added by akr (Akira Tanaka) about 5 years ago

  • configure.in (dirfd): Check function.

  • dir.c (dir_fileno): New method.
    [ruby-dev:48265] [Feature #9880]

Revision 47387
Added by akr (Akira Tanaka) about 5 years ago

  • configure.in (dirfd): Check function.

  • dir.c (dir_fileno): New method.
    [ruby-dev:48265] [Feature #9880]

Revision 47387
Added by akr (Akira Tanaka) about 5 years ago

  • configure.in (dirfd): Check function.

  • dir.c (dir_fileno): New method.
    [ruby-dev:48265] [Feature #9880]

Revision 47387
Added by akr (Akira Tanaka) about 5 years ago

  • configure.in (dirfd): Check function.

  • dir.c (dir_fileno): New method.
    [ruby-dev:48265] [Feature #9880]

Revision 47387
Added by akr (Akira Tanaka) about 5 years ago

  • configure.in (dirfd): Check function.

  • dir.c (dir_fileno): New method.
    [ruby-dev:48265] [Feature #9880]

History

Updated by akr (Akira Tanaka) over 5 years ago

とりあえず現在の作業のために ext/-test-/dir/ に入れました。

これで ruby 本体についてはテストで close しなかった fd を
より確実に確認できるようになりました。

しかし、close を忘れるのは (残念ながら) 珍しいことではないので、
Dir#fileno を ruby 本体以外にも提供することにより、
この確認を容易にするのは良いことだと思っています。

Updated by matz (Yukihiro Matsumoto) about 5 years ago

  • Category set to core
  • Assignee set to akr (Akira Tanaka)
  • Target version set to 2.2.0

Dir#fileno accepted. But we have to address portability issues in the document.

Matz.

Updated by akr (Akira Tanaka) about 5 years ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

Applied in changeset r47387.


  • configure.in (dirfd): Check function.

  • dir.c (dir_fileno): New method.
    [ruby-dev:48265] [Feature #9880]

Also available in: Atom PDF