open()没有正确设置文件权限

时间:2012-01-29 22:38:08

标签: c posix

我使用以下代码创建文件:

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>

int main()
{
    const char* filename = "./test.out";
    int fd;
    if(-1 == (fd = open(filename, O_CREAT|O_RDWR, 0666)))
    {
        perror("Error");
        errno = 0;
    }       
    else
        puts("File opened");

    if(-1 == (close(fd)))
    {
        perror("Error");
        errno = 0;
    }
    else
        puts("File closed");

    return 0;
}

我将mode参数指定为0666,它应该授予每个人读,写访问权限。但是,ls -l显示

-rw-r--r-- 1 kmehta users 0 2012-01-29 16:29 test.out

如您所见,写权限仅授予文件所有者。我不知道为什么其他人都没有被正确授予权限。 chmod a+w test.out正确设置权限。

代码编译为gcc -Wall test.c

规格:关于Opensuse 11.3 64位的gcc v 4.5.0

2 个答案:

答案 0 :(得分:16)

mode的{​​{1}}参数指定最大允许的权限。然后应用open设置以进一步限制权限。

如果您需要将权限设置为0666,则在打开成功后,您需要在文件句柄上使用umask

答案 1 :(得分:5)

执行此代码:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(void)
{
        int fd;
        if((fd = open("new.file",O_CREAT,S_IRWXU | S_IRWXG | S_IRWXO)) == -1)
        {
                perror("open");
                return 1;
        }
        close(fd);
        return 0;
}

在我的Linux机器上,其中umask返回0022,为我提供了一个包含以下属性的文件:

-rwxr-xr-x 1 daniel daniel 0 Jan 29 23:46 new.file

因此,正如您所看到的,umask屏蔽了我的写入位。它看起来在您的系统上也是一样的。