使用open()系统调用

时间:2009-02-27 19:44:24

标签: c file unix

我正在编写一个将输出写入文件的程序。如果此文件不存在,我想创建它。

目前,我在调用open时使用以下标志: O_WRONLY | O_CREATE

但是,当这创建文件时,它不会给我任何写入它的权限......

如何使用open来创建一个文件(如果该文件不存在),但会在需要时使用必要的权限创建它?

谢谢!

5 个答案:

答案 0 :(得分:17)

您可能需要第三个参数。例如:

open('path',O_WRONLY|O_CREAT,0640);

答案 1 :(得分:14)

只需使用open的可选第三个参数:

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

所以这样:

open("blahblah", O_CREAT | O_WRONLY, S_IRUSR | S_IWUSER | S_IRGRP | S_IROTH);

请参阅man open(2)

答案 2 :(得分:1)

在Linux上,您可以使用第三个参数来传递权限。 S_IWUSR应该是给你写权限的标志,但实际上你可能想要使用更多的标志而不是那个(按位或一起)。检查联机帮助页以获取权限标记列表。

答案 3 :(得分:1)

来自manual

  

O_CREAT

     

如果文件存在,除非在O_EXCL下注明,否则此标志无效   下面。否则,文件应该是   创建;文件的用户ID   设置为的有效用户ID   处理;文件的组ID   应设置为的组ID   文件的父目录或   过程的有效组ID; 并   访问权限位(见   )文件模式应该   设置为第三个的值   参数作为mod_t类型修改   如下:执行按位AND   在文件模式位和   补码中的相应位   进程'文件模式创建   面具。因此,文件模式中的所有位   其中的相应位在文件中   模式创建掩码设置被清除。   当文件以外的位   权限位设置,效果是   不确定的。第三个论点是   不影响文件是否打开   用于阅读,写作或两者兼而有之。   实现应提供一种方法   将文件的组ID初始化为   父目录的组ID。   实施可能,但不一定,   提供实现定义的方式   将文件的组ID初始化为   呼叫的有效组ID   过程

因此,您似乎需要传递指定所需文件权限的第三个参数。

答案 4 :(得分:1)

请注意,在POSIX(Unix,Linux,MacOS等)下,您可以打开并创建一个具有您选择的任何权限的文件,包括0(没有任何人的权限),但如果打开写入,仍然会写入该文件。