64,645
社区成员
发帖
与我相关
我的任务
分享
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <fcntl.h>
#define DIR_MAX_NUM 100
#define FILE_MAX_NUM 100
#define DIR_MAX_NAME_LEN 20
#define FILE_MAX_NAME_LEN 20
#define DIR_MAX_DIR_NUM 10
#define DIR_MAX_FILE_NUM 10
#define USED 1
#define UNUSED 0
typedef struct file_info_s
{
char used;
int file_index;
char file_name[FILE_MAX_NAME_LEN];
}file_info;
typedef struct dir_info_s
{
char used;
int dir_index;
char dir_name[DIR_MAX_NAME_LEN];
int dir_list[DIR_MAX_DIR_NUM];
int file_list[DIR_MAX_FILE_NUM];
}dir_info;
dir_info *g_dir;
file_info *g_file;
dir_info *g_cur_dir;
int add_dir(char* dir_name)
{
int i;
dir_info *dir;
for (i = 1; i < DIR_MAX_NUM; i++)
{
dir = &g_dir[i];
if (UNUSED == dir->used)
{
dir->used = USED;
dir->dir_index = i;
strcpy(dir->dir_name, dir_name);
return i;
}
}
printf("No more dirs can be added.\n");
return 0;
}
int add_file(char* file_name)
{
int i;
file_info *file;
for (i = 1; i < FILE_MAX_NUM; i++)
{
file = &g_file[i];
if (UNUSED == file->used)
{
file->used = USED;
file->file_index = i;
strcpy(file->file_name, file_name);
return i;
}
}
printf("No more files can be added.\n");
return 0;
}
void mkdir(char* dir_name)
{
int index;
int i;
index = add_dir(dir_name);
if (0 == index)
return;
for (i = 0; i < DIR_MAX_DIR_NUM; i++)
{
if (0 == g_cur_dir->dir_list[i])
{
g_cur_dir->dir_list[i] = index;
printf("Create new dir successfully.\n");
return;
}
}
printf("Failed to create new dir.\n");
}
void mkfile(char* file_name)
{
int index;
int i;
index = add_file(file_name);
if (0 == index)
return;
for (i = 0; i < DIR_MAX_FILE_NUM; i++)
{
if (0 == g_cur_dir->file_list[i])
{
g_cur_dir->file_list[i] = index;
printf("Create new file successfully.\n");
return;
}
}
printf("Failed to create new file.\n");
}
void dir()
{
dir_info *dir;
file_info *file;
int index;
int i;
printf("Dir list:\n");
for (i = 0; i < DIR_MAX_DIR_NUM; i++)
{
index = g_cur_dir->dir_list[i];
if (0 != index)
{
dir = &g_dir[index];
printf("%s\n", dir->dir_name);
}
}
printf("File list:\n");
for (i = 0; i < DIR_MAX_DIR_NUM; i++)
{
index = g_cur_dir->file_list[i];
if (0 != index)
{
file = &g_file[index];
printf("%s\n", file->file_name);
}
}
}
void cd(char* dir_name)
{
dir_info *dir;
int index;
int i;
for (i = 0; i < DIR_MAX_DIR_NUM; i++)
{
index = g_cur_dir->dir_list[i];
if (0 == strcmp(g_dir[index].dir_name, dir_name))
{
g_cur_dir = &g_dir[index];
printf("Cd %s successfully.\n", dir_name);
return;
}
}
printf("No such dir:%s.\n", dir_name);
}
void dir_init()
{
int fd;
fd = open("fs.dat", O_CREAT|O_RDWR|O_TRUNC, 00777);
lseek(fd, sizeof(dir_info) * DIR_MAX_NUM + sizeof(file_info) * FILE_MAX_NUM + 100, SEEK_SET);
write(fd, " ", 1);
g_dir = (dir_info *)mmap(NULL, sizeof(dir_info) * DIR_MAX_NUM + sizeof(file_info) * FILE_MAX_NUM, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
g_file = (file_info *)((char *)g_dir + sizeof(dir_info) * DIR_MAX_NUM);
// init root path
g_dir[0].used = USED;
g_dir[0].dir_index = 0;
strcpy(g_dir[0].dir_name, "root");
g_cur_dir = &g_dir[0];
}
int main()
{
char cmd[100] = {0};
char *name;
dir_init();
gets(cmd);
while (0 != strcmp("exit", cmd))
{
//printf("Cmd is \"%s\".\n", cmd);
if (0 == strncmp("dir", cmd, strlen("dir")))
{
dir();
}
else if (0 == strncmp("cd ", cmd, strlen("cd ")))
{
name = cmd + strlen("cd ");
cd(name);
}
else if (0 == strncmp("mkdir ", cmd, strlen("mkdir ")))
{
name = cmd + strlen("mkdir ");
mkdir(name);
}
else if (0 == strncmp("mkfile ", cmd, strlen("mkfile ")))
{
name = cmd + strlen("mkfile ");
mkfile(name);
}
else
{
printf("Wrong input:%s.\n", cmd);
}
gets(cmd);
}
return 0;
}
进程1:
mkdir abc
Create new dir successfully.
mkdir test
Create new dir successfully.
mkfile temp
Create new file successfully.
进程2:
dir
Dir list:
abc
test
File list:
temp