23-与目录有关的函数-mkdir 与 rmdir

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 124 18:06 ./
drwxrwxr-x 10 allen allen 4096 123 12:46 ../
-rwxrwxr-x  1 allen allen 7460 123 12:42 mychdir*
-rw-rw-r--  1 allen allen  199 123 12:42 mychdir.c
-rwxrwxr-x  1 allen allen 7384 124 18:02 mymkdir*
-rw-rw-r--  1 allen allen  203 124 18:02 mymkdir.c
-rwxrwxr-x  1 allen allen 7384 123 22:34 myrmdir*
-rw-rw-r--  1 allen allen  152 123 22:34 myrmdir.c
drwxrwxr-x  2 allen allen 4096 124 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 只能删除空目录
相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页