mkdir()函数中的mode_t参数
mkdir函数的定义:
#include <sys/types.h>
#include <sys/stat.h>
int mkdir(const char *pathname, mode_t mode)
关于mode_t的定义:
#ifndef __mode_t_defined
typedef __mode_t mode_t;
# define __mode_t_defined
#endif
__mode_t的定义:
#define __mode_t __MODE_T_TYPE
#define __MODE_T_TYPE __U32_TYPE
#define __U32_TYPE unsigned int
可以看到mode_t的定义实际就是unsigned int形式的。
但是函数mkdir(const char *pathname, mode_t mode)在解释mode_t时是将这里的mode当成8进制的去解释。
参数 mode 有下列数种组合
S_ISUID 04000 文件的执行时设置用户ID(set user-id on execution)位
S_ISGID 02000 文件的执行时设置组ID(set group-id on execution)位
S_ISVTX 01000 文件的保存正文(粘着位sticky)位
S_IRWXU 00700 文件所有者具有读、写、执行权限
S_IRUSR(S_IREAD) 00400 文件所有者具可读取权限
S_IWUSR(S_IWRITE)00200 文件所有者具可写入权限
S_IXUSR(S_IEXEC) 00100 文件所有者具可执行权限
S_IRWXG 00070 用户组具有读、写、执行权限
S_IRGRP 00040 用户组具可读取权限
S_IWGRP 00020 用户组具可写入权限
S_IXGRP 00010 用户组具可执行权限
S_IRWXO 00007 其他用户具有读、写、执行权限
S_IROTH 00004 其他用户具可读取权限
S_IWOTH 00002 其他用户具可写入权限
S_IXOTH 00001 其他用户具可执行权限
比如要创建test文件夹,权限是744,那么可以采用以下几种方法:
mkdir("/SERVICE01/vbird/test", S_IRWXU|S_IRGRP|S_IROTH);
mkdir("/SERVICE01/vbird/test", 0744);
mkdir("/SERVICE01/vbird/test", 484);
第一种方法是将00700和00040和00004进行或运算,最终得到的结果就是0744(八进制表示方法是首位为0,十六进制是0x),八进制的0744就等于十进制的484。所以上面三种方法是等效的。
当我们给mkdir函数传递参数时他会将对应的十进制的mode参数转换为相应的八进制进行运算。所以文件的权限为744时传递给函数mkdir的参数就应该写成0744(八进制表示方法)或者484(十进制表示方法)
当然一般创建目录的时候应该给可执行权限,也就是755,否则是无法cd切换目录进去的。
附录:
chmod()也有类似用法
#include <sys/stat.h>
int chmod(const char *path, mode_t mode);
int fchmod(int fd, mode_t mode);
相比chmod命令,使用时可以直接输入644。具体的chmod实现时可能是将644接收后(接收时可能是以字符串形式接收)认为644是八进制的数据,然后将644转换为对应的十进制,然后直接传递给函数chmod(const char *path, mode_t mode)。