2

次のCコードがある場合:

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

これをコンパイルして実行すると、不当にこれが作成されることはありません。

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

ただし、Pythonモジュールにコンパイルされた次のCコード:

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

これを行います:

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

そして当然のことながら、ファイルを作成したコードは次回はファイルを開くことができません。

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

その価値についてはmmap、後でファイルを作成します。

ありがとう!

ジョー

編集:私はchmodこれを修正できることを知っています、問題はなぜですか?

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

4

1 に答える 1

6

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

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

それ以外の場合、動作は定義されていません。最初の例でのファイルの作成が機能する可能性はほとんどありません。また、umask指定したモードと常にANDで結合されているものも確認してください。

于 2011-01-31T21:33:04.527 に答える