为什么open()创建的文件的权限与触摸不同?

时间:2012-10-04 06:29:53

标签: c linux

#include<apue.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>

int main(int argc , char *argv[])
{
    int fd = open("test.txt",O_WRONLY | O_CREAT | O_TRUNC);
    int pid,status;
    const char *str_for_parent = "str_for_parent\n";
    const char *str_for_child = "str_for_child\n";
    if ((pid = fork()) < 0)
        err_sys("fork error");
    else if (pid == 0)
    {
        write(fd,str_for_child,strlen(str_for_child)+1);
        _exit(0);
    }
    wait(&status);
    write(fd,str_for_parent,strlen(str_for_parent)+1);

    return 0;
}

test.txt是由open()创建的。但是它的权限(---------x)与-rw-rw-r--或其他任何软件创建的文件(touch)不同我的system.my umask 0002

2 个答案:

答案 0 :(得分:5)

open实际上采用了(可选的)第三个参数:

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

新文件的模式设置为mode的AND和umask的倒数(即mode & ~umask)。因为你没有传递mode,所以它被初始化为一些垃圾,结果你得到了错误的模式。

通常,如果您通过O_CREAT,则应传递mode 0666,除非您有某些特定原因要使用其他模式(例如,如果您想要确保其他用户无法读取该文件,无论umask设置为什么。)

答案 1 :(得分:2)

如果向O_CREAT提供open()标志,则还必须提供第三个mode参数,该参数与当前umask组合以设置创建文件的权限位。

除非您专门创建可执行文件,否则几乎总是使用0666作为此参数:

int fd = open("test.txt",O_WRONLY | O_CREAT | O_TRUNC, 0666);

这应该会给您与touch相同的结果。请注意,C中的前导零表示八进制常量。