2012-10-04 52 views
2
#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被打開()創建的。但它的權限(---------x)是由touch創建這些文件(-rw-rw-r--),或在我的system.my任何其他軟件不同的umask0002爲什麼通過open()創建的文件的權限與touch不同?

回答

5

open實際需要(可選的)第三個參數:

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

新文件的模式設置爲mode AND和的倒數您umask(即mode & ~umask)。既然你沒有通過mode,它已經被初始化爲一些垃圾,並且你得到了錯誤的模式。

一般來說,如果你傳遞O_CREAT,你要經過的0666mode,除非你有特別原因需要使用一些其他的模式(例如,如果你想不管確保該文件是不會被其他用戶讀取umask設置爲什麼)。

2

如果您提供O_CREAT標誌爲open(),您還必須提供第三個mode參數,該參數與當前umask結合以設置創建的文件的權限位。

除非你專門創建一個可執行文件,你應該總是使用0666作爲此參數:

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

這應該給你,你從touch看到同樣的結果。請注意,C中的前導零表示八進制常數。