【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; }
结果就不用多说了!