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

  结果就不用多说了!

原文地址:https://www.cnblogs.com/ngnetboy/p/3319939.html