mkdir 命令的实现

mkdir 命令的模拟实现

再让我们来看看 mkdir 的实现。

完整的代码如下:

清单 3. mkdir 实现代码

#include
#include
#include
int main(int argc, char *argv[]){
int rt;
if( (rt = mkdir (argv[1],10705)) == -1 ){
fprintf(stderr,"cannot mkdir");
}
return 0;
}

这段代码也比较简单,我这里就不逐行解释了,主要说以下几点:

首先 mkdir 函数是定义于 和 头文件之中的。

而 fprintf 函数是位于 文件之中的。

mkdir 的函数原型如下:

int mkdir(const char *pathname, mode_t mode);

mode 声明为 mode_t 类型。

那么 mode_t 数据类型是什么数据类型,应该从哪个文件去查看它的定义呢?

mode_t 数据类型究竟是什么类型

让我们逐步查找一下。

首先从文件 /usr/include/sys/stat.h 中找到 mode_t 类型

/usr/include/sys/stat.h -> typedef __mode_t mode_t;

说明 mode_t 只是对 __mode_t 的一种定义。

然后从 /usr/include/bits/types.h 中找到 __mode_t 类型

/usr/include/bits/types.h -> __STD_TYPE __MODE_T_TYPE __mode_t;

说明 __mode_t 也只是对 __MODE_T_TYPE 的一种定义。

/usr/include/bits/typesizes.h -> #define __MODE_T_TYPE __U32_TYPE

说明 __MODE_T_TYPE 是对 __U32_TYPE 的一种定义。

/usr/include/bits/types.h -> #define __U32_TYPE unsigned int

最后 __U32_TYPE 是一种无符号的整数的定义。

从上述推导可以看出,mode_t 实际上也就是一种无符号整数。

另外如下结构 struct stat 定义中的 st_mode 成员变量也是使用的 mode_t 类型的变量。

从 man 2 stat 中可以找到结构 struct stat 的定义,如下:

struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* inode number */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device ID (if special file) */
off_t st_size; /* total size, in bytes */
blksize_t st_blksize; /* blocksize for filesystem I/O */
blkcnt_t st_blocks; /* number of blocks allocated */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last status change */
};

该结构也是我们在后面的 tac 命令实现中需要用到的结构体。我们需要用到结构体中的 st_size 成员,该成员反映了被读取的文件描述符对应的文件的大小。


相关内容