mkdir 是用来创建一个空目录的,而 rmdir 用来删除空目录。与 linux 命令的 mkdir
不同的是,mkdir 函数需要指定目录的权限位。想必你已经对 mode 相当熟悉了。不过,对于目录来说,权限位还有一些坑,也没那么容易。
1 目录的权限位
- 目录的权限位,至少要设置一个执行许可位。即
rwx
中的那个x
位。如果不设置,就没办法使用cd
命令进入目录,也无法读取目录下的文件内容。所以,这个位是必须的。 - 目录的写权限位。如果未设置写权限位(
w
位),将导致无法向目录文件中写入目录项(dir_entry 结构)。比如不能使用 touch 命令创建文件。 - 目录的读权限位。如果未设置读权限位,将导致无法读取目录文件中的目录项。比如你不能使用 ls 命令查看目录项的具体内容。
推荐使用的目录权限位是 rwxrwxr-x
,即 8 进制的 775.
2 实例
2.1 实现 mymkdir 命令
- 函数原型
int mkdir(const char *pathname, mode_t mode);
注意该函数不能创建多级目录。
- 代码
// mymkdir.c
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
int main(int argc, char* argv[]) {
if (mkdir(argv[1], 0775) == -1) { // 权限位设置为 0775 注意前面的 0 不能少,它表示 8 进制的数。
perror("mkdir");
return -1;
}
return 0;
}
- 编译
$ gcc mymkdir.c -o mymkdir
- 运行
$ ./mymkdir testdir
$ ll
drwxrwxr-x 3 allen allen 4096 12月 4 18:06 ./
drwxrwxr-x 10 allen allen 4096 12月 3 12:46 ../
-rwxrwxr-x 1 allen allen 7460 12月 3 12:42 mychdir*
-rw-rw-r-- 1 allen allen 199 12月 3 12:42 mychdir.c
-rwxrwxr-x 1 allen allen 7384 12月 4 18:02 mymkdir*
-rw-rw-r-- 1 allen allen 203 12月 4 18:02 mymkdir.c
-rwxrwxr-x 1 allen allen 7384 12月 3 22:34 myrmdir*
-rw-rw-r-- 1 allen allen 152 12月 3 22:34 myrmdir.c
drwxrwxr-x 2 allen allen 4096 12月 4 18:02 testdir/
2.2 实现 rmdir 命令
- 函数原型
int rmdir(const char *pathname);
注意,该函数只能删除空目录。
- 代码
// myrmdir.c
#include <unistd.h>
#include <stdio.h>
int main(int argc, char* argv[]) {
if (rmdir(argv[1]) == -1) {
perror("rmdir");
return -1;
}
return 0;
}
- 编译
$ gcc myrmdir.c -o myrmdir
- 运行
$ ./myrmdir testdir
3 总结
- 知道不合适的目录权限位会带来什么后果
- 掌握 mkdir 函数和 rmdir 函数
- 知道 mkdir 不能创建多级目录
- 知道 rmdir 只能删除空目录