mkdir()函数、mode_t参数

本文详细解析了mkdir函数中mode_t参数的意义及其使用方法,包括不同权限组合的含义,并提供了实例演示如何通过不同方式设置目录权限。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)。


### mkdir 函数参数说明与用法 `mkdir` 是一个用于创建目录的函数,常见于多种编程语言和系统调用中。以下是其参数、用法及示例的详细说明。 #### 参数说明 在 C 语言中,`mkdir` 的定义如下: ```c int mkdir(const char *pathname, mode_t mode); ``` - **pathname**:这是必填参数,表示要创建的目录路径。可以是相对路径或绝对路径[^1]。 - **mode**:这是一个权限掩码,指定新创建目录的权限模式。它通常由 `S_IRWXU`(用户读写执行)、`S_IRGRP`(组读)、`S_IXGRP`(组执行)等宏组合而成[^1]。 在 PHP 中,`mkdir` 的定义如下: ```php bool mkdir ( string $path [, int $mode = 0777 [, bool $recursive = false [, resource $context ]]] ) ``` - **path**:必填参数,表示要创建的目录路径,可以是相对路径或绝对路径[^4]。 - **mode**:可选参数,默认值为 `0777`,表示目录的权限。注意,实际权限可能会受到 umask 的影响。 - **recursive**:可选布尔值,如果设置为 `true`,则可以递归创建多级目录。 - **context**:可选参数,用于指定流上下文。 #### 示例代码 以下是一些不同语言中的 `mkdir` 使用示例: ##### C 语言示例 ```c #include <stdio.h> #include <stdlib.h> #include <sys/stat.h> #include <sys/types.h> int main(void) { int ret; ret = mkdir("./new_dir", S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH); // 创建目录并设置权限 if (-1 == ret) { perror("mkdir error"); // 如果失败,输出错误信息 exit(-1); } exit(0); } ``` 此代码片段展示了如何使用 `mkdir` 创建名为 `new_dir` 的目录,并为其分配特定权限[^1]。 ##### PHP 示例 ```php <?php $path = '/var/www/html/new_folder'; // 目标目录路径 $mode = 0755; // 权限设置 $recursive = true; // 是否递归创建 if (!mkdir($path, $mode, $recursive)) { echo "创建目录失败"; } else { echo "目录创建成功"; } ?> ``` 这段代码演示了如何在 PHP 中使用 `mkdir` 创建一个多级目录,并设置了权限和递归选项[^4]。 #### 注意事项 - 在 C 语言中,`mode` 参数的实际效果可能受 umask 的影响,因此最终权限可能与指定的不同。 - 在 PHP 中,递归选项允许一次性创建多层目录结构,这在处理复杂路径时非常有用。 - 确保目标路径具有足够的权限以执行目录创建操作,否则可能会导致错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值