In message <1093099069.657866.26534.nullmailer / picachu.netlab.jp> on Sat, 21 Aug 2004 23:54:59 +0900, matz / ruby-lang.org (Yukihiro Matsumoto) wrote: > これは反論ではなくて、純粋に質問なのですが、 > > * fopen(3)には書き込みオープンによって新規に作成されるファ > イルのパーミッションを明示的に指定する方法はない > * これを制御する唯一の方法はumaskである > > * しかし、「ライブラリ的な関数は呼び出し側のumask設定に依 > 存すべきでない」。 次善の策としては、fopen(3)する前にuamskを設定して、後で元に戻すという あたりでしょうか。 mode_t mask; FILE *fp; mask = umask(077); fp = fopen(file, "r+"); umask(mask); ... > * ということは、ライブラリ的関数でfopenを使ってファイルを > 新規に作成することは「やってはいけないこと」である。ライ > ブラリ的関数でファイルを新規作成する場合には、open(2)を > 直接使う必要がある > > ということなのでしょうか。 C言語のレベルでは、open(2)で開いといてから、fdpen(3)するというのも、あ りがちな方法に思えます。 > それならそれで納得できないことはないのですが、結構違反してい > るケースは多そうな気がします。 ポイントは、CGI::Sessionのような作成するファイルのアクセス権が問題とな る場合です。「ライブラリ的な関数は呼び出し側のumask設定に依存すべきで ない」と書いてしまいましたが、作成するファイルのアクセス権に特別な制限 が不要で、現在のumaskに影響されても良いというケースもありそうな気がし ます。 (風邪で2日弱寝込んでたので、今一つ気の回ってないところがあるかもしれま せん。) -- 神戸 隆博 / Takahiro Kambe