首先说一下open函数是什么吧,open函数是在linux中定义的用来打开一个文件的函数,其函数原型是这个样子:
其中第三个参数可有可没有!当flags中含有O_CREAT这个参数的时候,必须有第三个参数,第三个参数用来表明创建的文件的权限!那么它是如何表示权限的呢?
首先来看mode_t这个类型,我的系统是32位的,在我的系统中定义的是一个无符号整型,它表示权限的方法如下(前面省略了16个0):
从低往上,每三位为一组,分别表示其他人,组,用户,还有特殊权限(SUID权值为4,SGID权值为2,sticky bit权值为1)。
比如如果我们输入一个0664,表示的就是0000 000 110 110 100,等价于-rw-rw-r--。
那如果我想要加入特殊权限该怎么做呢,很简单啊,变成相应数值就好!比如我想设置一个-rwsr-xr-x的权限,先变成二进制,就是0000 100 111 101 101,然后变成八进制,04755,这样直接设置就好了!
最后来举个例子吧,在这个例子中我通过十进制来设置权限值,大家可以看到和八进制的方法作用是相同的!
比如我想创建一个权限为-rw-r--r--的文件,那么它的二进制值就是0000 000 110 100 100,变成十进制就是420,然后我写了个程序如下:
#include<stdio.h> #include<errno.h> #include<fcntl.h> #include<sys/stat.h> #define FLAGS O_CREAT | O_RDWR | O_TRUNC int main(int argc,char *argv[]) { int pfd; if((pfd=open("decimal",FLAGS,420)) == -1) //注意我这里设置权限值用的是十进制 perror(argv[0]); close(pfd); return 0; }
然后运行结果如下:
注意那个decimal是我最后创建的文件!