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

但是下面的 C 代码,编译成 Python 模块:

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:感谢Rosh Oxymoron指出我错过了不那么可选的可选参数。TRWTF是第一个示例完全有效!

4

1 回答 1

6

该函数open接受三个参数。如果您指定O_CREAT标志,则需要使用此签名调用它:

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

否则行为未定义。在您的第一个示例中创建文件的可能性很小。另请查看umask哪个始终与您指定的模式进行 AND 运算。

于 2011-01-31T21:33:04.527 回答