open() not setting file permissions correctly

来源:互联网 发布:九城软件 编辑:程序博客网 时间:2024/06/02 07:06

http://stackoverflow.com/questions/9057419/open-not-setting-file-permissions-correctly


open() not setting file permissions correctly

up vote0 down vote favorite

I create a file using the code below:

#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;}

I specify the mode argument as 0666, which should grant read,write access to everyone. However, anls -l shows

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

As you can see, write permissions are only granted to the owner of the file. I do not know why everyone else is not granted permissions correctly.chmod a+w test.out sets the permissions correctly though.

Code compiled as gcc -Wall test.c

Specs: gcc v 4.5.0 on Opensuse 11.3 64 bit

share|improve this question
 
3 
check umask. check umask. – wildplasserJan 29 '12 at 22:40
 
Did you try using constants for flags, e.g. S_IRUSR, S_IRGRP, etc.? – dasblinkenlightJan 29 '12 at 22:41
 
@dasblinkenlight Using constants didnt help. It was a umask issue, using fchmod after file open now as shown in the answer – KVMJan 29 '12 at 22:59

2 Answers

activeoldestvotes
up vote6 down vote accepted

The mode argument to open specifies the maximum allowed permissions. Theumask setting is then applied to further restrict the permissions.

If you need to make the permissions be 0666 specifically you will need to use fchmod on the file handle after the open succeeds.

share|improve this answer
  
up vote1 down vote

Executing this code :

#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;}

on my Linux box, where umask returns 0022, gives me a file with the following attributes :

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

So, as you can see, the umask masks out the write bits in my case. It looks like it's the same on your system, too.

share|improve this answer
  

Your Answer















 

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions taggedc posix or ask your own question.



原创粉丝点击