#include<fcntl.h> int creat(const char *pathname, mode_t mode);
若成功則返回為只寫打開的文件描述符,若出錯則返回-1;
有時候我們使用creat函數的時候可能會得不到我們想要的結果。例如:
creat("foo",0666)
當我們使用次函數的目的創建一個文件——foo,foo的屬性為 -rw-rw-rw-;
但是我們執行完creat函數之后可能會發生其他的結果,筆者的系統是REHL5.1,當我執行完creat函數之后foo的屬性為:-rw-r--r--;
這是為什么呢?
如果你想知道為什么,就在命令行里執行umask看一下吧;
筆者執行完umask的結果為022;umask為何物?
該命令用來設置限制新文件權限的掩碼。當新文件被創建時,其最初的權限由文件創建掩碼決定。用戶每次注冊進入系統時,umask命令都被執行,並自動設置掩碼改變默認值,新的權限將會把舊的覆蓋。
默認情況下root的umask為022,一般用戶為002。通過vim或者vi創建文件的時候文件的屬性為 666 - 默認的umask值;建立目錄的時候,目錄的屬性為777 - umask的默認值;
了解了這些,執行creat函數的結果就不會感到意外了。初始的屬性為0666但是默認的umask為022.所以創建文件的屬性就變成了-rw-r--r--;
如何達到自己想要的結果呢?毫無疑問用umask函數吧;
#include<sys/stat.h>
mode_t umask(mode_t cmask);
返回值:以前的文件模式創建屏蔽字(沒有出錯返回值);
下面用一個例子直接展示吧!
#include<stdio.h> #include<sys/stat.h> #include<fcntl.h> #include<stdlib.h> int main(int argc, char *argv[]) { umask(0); if(creat("foo",0666) < 0){ printf("creat foo error!"); exit(1); } umask(022); if(creat("bar",0666) < 0){ printf("creat bar error!"); exit(1); } return 0; }
結果就不用多說了!
