【C】——使用creat()函數需要注意的事項


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

  結果就不用多說了!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM