操作系统实验——开发自己的 ls 程序
任务描述
请实现如下功能:
写一个程序 myls.c ,其功能是显示当前目录下的内容。要求首先在 Ubuntu 中测试该程序,然后用版本 0 内核启动 bochs 虚拟机,在该虚拟机中编译运行该程序,画面如下图所示

代码实现
本关用到了C库函数中的目录操作,下面介绍代码中使用的函数:
- memset是一个初始化函数,作用是将某一块内存中的全部设置为指定的值。
#include
void *memset(void *s, int c, size_t n);
s指向要填充的内存块。
c是要被设置的值。
n是要被设置该值的字符数。
返回类型是一个指向存储区s的指针。
- getcwd()会将当前工作目录的绝对路径复制到参数buffer所指的内存空间中,参数size为buf的空间大小。函数声明如下:
#include
char *getcwd(char *buf,size_t size);
- opendir()它返回一个DIR类型,是一个句柄,句柄要传给readdir()函数的参数就行了。(传入name路径,成功则返回非空DIR指针,否则返回NULL)
注:句柄就是指针的指针,在这里返回的是一个指向结构体指针的指针 - closedir()关闭目录,成功返回0,否则返回非零值
- readdir()读取目录下文件操作,返回值为结构体,其中
d_ino 此目录进入点的 inode
d_off 目录文件开头至此目录进入点的位移
d_reclen name 的长度,不包含 NULL 字符
d_type d_name所指的文件类型
d_name 文件名
返回值:成功则返回下个目录进入点,有错误发生或读取到目录文件尾则返回NULL
#include
DIR *opendir(const char name);
struct dirent readdir(DIR dir);
struct dirent { //结构体
ino_t d_ino; / inode number /
off_t d_off; / offset to the next dirent /
unsigned short d_reclen; / length of this record /
unsigned char d_type; / type of file /
char d_name[256]; / filename */
};
int closedir(DIR *dir);
以上是本代码用到的函数知识点,以下是具体代码实现
#include
#include
#include
#include int main(int argc, char *argv[]){DIR *dir;struct dirent *entry;char pwd[301];memset(pwd,0,sizeof(pwd));getcwd(pwd,300);dir = opendir(pwd);while((entry = readdir(dir))!=0)printf("%s\t", entry->d_name);printf("\n");closedir(dir);return 0;
}
注意
第一次编译的时候发生了报错,内容为:

意思是在bochs虚拟机的dirent.h头文件中缺少NAME_MAX的定义,需要自己补充,具体操作如下:
进入include/sys目录下,使用uemacs dirent.h操作

在其中添加define NAME_MAX 50后保存退出

编译实现
操作完注意事项后即可使用gcc myls.c -o myls编译运行,效果如下:

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
