2011-01-31 3 views
2

で作成されたファイルからのファイルのパーミッション:地球上で何が...?私は、次のCコードをお持ちの場合はPython Cコード

-rw-r----- 1 joewass staff  0B 31 Jan 21:17 testfilefromc 

しかし、次のCコード、:私はコンパイルして不当ではない実行

int main(int argc, char **arg) 
{ 
    int x = open("testfilefromc", O_RDWR | O_CREAT); 
    return 0; 
} 

はこれを作成し、 Pythonモジュールにコンパイル:

const char *filename = "testfilefrompython"; 
context->fd = open(filename, O_RDWR | O_CREAT); 

この行います

---------- 1 joewass staff 165B 31 Jan 21:09 testfilefrompython 

驚くことではないが、ファイルを作成したコードは、次回に開くことはできません!

なぜファイルはゼロのパーミッションで作成されますか?そして、CでPythonモジュールにコンパイルされた動作が異なるのはなぜですか?私はコードを実行するPythonプログラムを実行しています。

これは価値があるので、私はmmapファイルを後で作成しています。

ありがとうございます!

ジョー

EDIT:私は、私はchmodは、この問題を解決することができます知っている疑問は、なぜのですか?

EDIT 2:私はそれほど別売オプションの引数を逃したことを指摘しRosh Oxymoronに感謝します。 TRWTFは、最初の例がまったく機能しているということです!

+1

Cコードのどこかで 'umask()'を呼び出していることがありますか? –

+0

'strace'の下であなたのコードを実行しようとしてください。 'open' /' creat'と 'chmod' /' fchmod'呼び出しに注意してください。 –

+0

@Frédéric - 私のコードにはumaskはありません。 Pythonが何をしているのか誰が知っているのですか? – Joe

答えて

6

関数openには3つの引数があります。あなたがO_CREATフラグを指定する場合は、この署名を使用してそれを呼び出す必要があります。

int open(const char *pathname, int flags, mode_t mode); 

そうでない場合の動作は未定義です。あなたの最初の例のファイルの作成がまったく機能しないことはほとんどありません。 umaskもご覧ください。このモードは、指定したモードで常にANDされます。

+0

あなたは完全に正しいです。私はmanページ(Macでは 'int open(const char * path、int oflag、...);と書かれています。ありがとうございました! – Joe

関連する問題