Gauche > Archives > 2010/11/11

2010/11/11 20:54:59 UTCshiro
#
ある整数が与えられて、それに相当するファイルディスクリプタが今のプロセスでオープンされてるかどうか、ってのを副作用なく調べる方法はあるか?
#
dup呼ぶと副作用があるから後始末が面倒。
#
lseekだとfdがパイプやソケットの場合に困る…いや困らないか。結果がEBADFかどうかだけ見ればいいのか。
#
む、今のGaucheではinteger fdに対して直接lseekを呼ぶ方法がないかな。
#
open-*-fd-portは内部でfdopenを呼ぶけど、これはfdが無効なものであっても成功する。
#
ただそれで得られたportにport-tellを実行すると単に#fが帰って、これではunseekableだけどopenされてるポートと区別がつかない。
2010/11/11 21:21:49 UTCshiro
#
やっぱり一時的にダミーのポートを開いて、そいつに向かってport-fd-dup!してみるしかないかな?
2010/11/11 22:49:20 UTC(び)
#
Linux縛りでよければ、/proc/{自分のpid}/fd/{その整数} というファイルが存在するかどうか、というやり方もできますね。
#
Linux の procfs はリッチすぎて、もはやprocfsとは呼べない気がする(笑)。
2010/11/11 22:50:40 UTCshiro
#
ああそうか。しかし他のプラットフォームで別の手段に切り替えるのも面倒だな。
2010/11/11 22:50:53 UTC(び)
#
ポータブルな方法となるとやっかいですね
2010/11/11 22:51:36 UTCshiro
#
まあwindowsだとファイルディスクリプタによる操作ってのは馴染まないんでUnixファミリー限定の話ではあるんだけれど。
2010/11/11 22:52:00 UTC(び)
#
*BSDでは、そもそも/procが一般的じゃなくて(あるけど)
#
/proc にしても、Linuxのようにはリッチじゃないので、さきほどのやり方はほぼLinux縛りですね。
2010/11/11 22:59:02 UTCshiro
#
なんでそんなことが必要になったかというと、(1)rfc.httpのhttpsサポートでstunnelを使うんだが、stunnel 4ではパラメータをextra file descriptor経由でパイプ作って渡す必要がある (2)じゃあrun-processを拡張してシェルみたいに自由にredirectionできるようにしよう (3)ついでだからシェルみたいに <& >& とかも使えるといいな (4)親プロセスからfd指定でdupする時に既にそのfdが開いてるかどうか知りたい、という流れ。
2010/11/11 23:02:30 UTC(び)
#
なるほど
#
Perlはどうやっているんだろう
#
Perlのopen()って、そこいら辺の機能がてんこ盛りだった気が。
#
あーでもfdは渡せないか
2010/11/11 23:05:58 UTCshiro
#
現在のコードだとこんな感じで、fd=3にパイプ渡してます。
#
(define (run-stunnel4 path)
      (lambda (host:port)
        (receive (in out) (sys-pipe)
          (rlet1 p (run-process `(,path "-fd" 3)
                                :redirects `((< 0 stdin)
                                             (> 1 stdout)
                                             (> 2 :null)
                                             (< 3 ,(port-file-number in)))
                                :wait #f)
            (format out "client = yes\n")
            (format out "connect = ~a" host:port)
            (close-output-port out)))))
#
たぶんこんなことする必要があるのってレアケースなんだけれど、出来ないとなると回避策が非常に面倒 (別にシェルスクリプト作って起動したりとか) なんだよね。
2010/11/11 23:58:02 UTC(び)
#
ふむ...
#
dup(2)しか思いつかないですね... なんかありそうな気がするんだけど。