2012-01-29 54 views
7

我創建使用下面的代碼文件:的open()未設置文件權限正確

#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

規格:GCC v 4.5.0在openSUSE 11.3 64個

+3

檢查umask。檢查umask。 – wildplasser 2012-01-29 22:40:07

+0

你是否嘗試使用常量來表示標誌,例如S_IRUSR,S_IRGRP等? – dasblinkenlight 2012-01-29 22:41:39

+0

@dasblinkenlight使用常量沒有幫助。這是一個umask問題,現在打開文件後使用fchmod,如答案 – jitihsk 2012-01-29 22:59:18

回答

15

mode參數open指定最大允許權限。然後應用umask設置來進一步限制權限。

如果您需要將權限設置爲0666,則在打開成功後,您需要在文件句柄上使用fchmod

+2

+1所示。兩年後,我在做CS作業時偶然發現了這個問題。我不知道我必須'fchmod'才能將權限明確設置爲'0666' – yiwei 2014-10-21 01:00:55

3

執行此代碼:

#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掩蓋了寫入位。它看起來在你的系統上也是一樣的。