This is the code inside mem\_filesystem.c

#include 
#include 
#include 
#include 
struct Dir\_ {
struct Dir\_ \* parent;
struct List \* dir;
char \* name;
};

struct Fil {
char \* name;
int size;
char \* data;
};
union ListItem{
struct Fil \* file;
struct Dir\_ \* root;
};
struct List{
int type;
union ListItem li;
struct List \* next;
};

struct Dir\_\* head;
struct Dir\_ \* current;

struct Dir\_\* newDir\_(char \* name,struct Dir\_ \* parent){
struct Dir\_ \* n = malloc(sizeof(struct Dir\_));
n->parent = parent;
n->dir = NULL;
n->name = (char \*)malloc(strlen(name)+1);
strcpy(n->name,name);
return n;
}

void listdir(){
printf("listdir\n");
for (struct List\*l=current->dir;l;l=l->next)
 if (l->type ==0)
 if (l->li.file)
 printf("file-- %s\n",l->li.file->name);
}

void copyit(char \*src,char\*dest){
 printf("copyit src=%s= dest=%s=\n",src,dest);
 struct List \*l = malloc(sizeof(struct List));
 struct Fil \* f = malloc(sizeof(struct Fil));

 FILE \*fp;
 f->name = malloc(strlen(dest)+1);
 strcpy(f->name,dest);
 
 fp = fopen(src,"r");
 if (!fp){
 printf("cant open %s\n",src);
 return;
 }
 fseek(fp,0l,SEEK\_END);
 long len = ftell(fp);
 printf("len = %ld\n",len);
 fseek(fp,0l,SEEK\_SET);
 f->data = malloc((int)len);
 f->size=(int)len;
 for (int i=0;i<(int)len;i++)
 f->data[i] = fgetc(fp);
 
 fclose(fp);
 l->li.file = f;
 l->type =0;
 l->next = current->dir;
 current->dir=l;
}

void catit(char \* file){
printf("catit\n");
for (struct List\*l=current->dir;l;l=l->next)
 if (l->type ==0 && l->li.file && !strcmp(file,l->li.file->name)){
 struct Fil \*f = l->li.file;
 printf("found-- %s %d\n",f->name,f->size);
 for (int i=0;isize;i++)
 printf("%c",f->data[i]);
 }
}
// walk down the directory tree to find the file in path.
// return:
// 1) the containing directory Dir\_ 
// 2) the actual file name.
// e.g. if path == /dir1/dir2/asdf.h
// file name will be asdf.h
// return a point to the dir2 data structure
struct Dir\_ \* walk(struct Dir\_\* n, char \* path,char \*\*filename){

 path++;
 while(1){
 if (!strchr(path,'/')){
 printf("walk end %s\n",path);
 \*filename = path;
 return n;
 }
 else{
 char \* p = strchr(path,'/');
 if (p){
 printf("walk1 %s\n",path);
 for (struct List \*l = n->dir;l;l=l->next){
 \*p =0;
 /\* if (l->type ==1)
 printf("walk2 path=%s %s===\n",path,l->li.root->name);
 else
 printf("walk2 path=%s %s===\n",path,l->li.file->name);
 \*/
 if (l->type == 1 && l->li.root && !strcmp(path,l->li.root->name)){
 
 printf("walking remaining path = %s dir =%s\n",p+1,l->li.root->name);
 path = p+1;
 n = l->li.root;
 }
 \*p='/';
 }
 }
 else
 return n;
 } 
 }
}

// gets full path to the file could be a dir or an ordinary file
// return 1 for file and its size
// return 2 for directory
int statit(char \*name,int \*psize){
printf("statit %s\n",name);
 \*psize=0;
 char \* file=NULL;
 struct Dir\_ \* n = walk(head,name,&file);
 printf("after walk %s %s\n",n->name,file);
 if (!file){
 printf("walk did not find it %s\n",name);
 return 0;
 }
 // we have the directory data structure and the filename extracted from the path
 for (struct List\*l=n->dir;l;l=l->next)
 if (l->type ==0 && l->li.file && !strcmp(file,l->li.file->name)){
 struct Fil \*f = l->li.file;
 printf("found-- %s %d\n",f->name,f->size);
 \*psize=f->size;
 return 1;
 }
 else
 if (l->type ==1 && l->li.root && !strcmp(file,l->li.root->name)){
 struct Dir\_ \*n = l->li.root;
 printf("found dir-- %s \n",n->name);
 return 2;
 }
}

// read some contents from the file
// gets full path to the file could be a dir or an ordinary file
// if it is file then fill buffer starting at offset in the file
int do\_read( char \*path, char \*buffer, size\_t size, off\_t offset, struct fuse\_file\_info \*fi){
int i=0;
 printf( "--> Trying to read %s, %d, %d\n", path, (int)offset, (int)size );
 char \* file=NULL;
 struct Dir\_\* d = walk(head,path,&file);
 printf("after walk %s %s\n",d->name,file);
 
 /\* TODO 
 find the file in the list given by d->dir 
 copy the contents of the file to the buffer.
 return the amount copied.
 \*/
 char buf[400];
 sprintf(buf,"path=%s=file=%s= hello world\n",path,file);
 int sz = strlen(buf);
 // put in some dummy stuff into the file
 for (i=0;i Getting The List of Files of %s\n", path );
 
 filler( buffer, ".", NULL, 0 ); // Current Directory
 filler( buffer, "..", NULL, 0 ); // Parent Directory
 char \* file=NULL;
 struct Dir\_\* d = walk(head,path,&file);
 printf("after walk %s %s\n",d->name,file);
 
 // input could be dir1/dir2
 // d points to the dir1 data structure
 // file is dir2
 // need to look for the dir2 data structure
 if (\*file){
 for (struct List\*l=d->dir;l;l=l->next){
 if (l->type ==1 && l->li.root&& !strcmp(file,l->li.root->name)){
 d = l->li.root;
 printf("\*\*\*\*readdir found dir-- %s\n",d->name);
 }
 }
 }
 
 for (struct List\*l=d->dir;l;l=l->next){
 if (l->type ==0 && l->li.file ){
 struct Fil \*f = l->li.file;
 printf("read dir found-- %s %d\n",f->name,f->size);
 filler( buffer, f->name, NULL, 0 );
 }
 else
 if (l->type ==1 && l->li.root ){
 struct Dir\_ \*n = l->li.root;
 printf("readdir found dir-- %s\n",n->name);
 filler( buffer, n->name, NULL, 0 );
 }
 }
 return 0;
 
}
struct Dir\_ \*mkDir\_(char \*dir){
 printf("mkdir\n");
 struct Dir\_ \* n;
 struct List \*l = malloc(sizeof(struct List));
 l->li.root =n = newDir\_(dir,current);
 l->type =1;
 l->next = current->dir;
 current->dir=l;
 return n;
}

// setup some directories and some files
/\* 
 /ss
 /test1
 /dir1
 /dir1/t1
 /dir1/ss1.c
 /dir1/dir2
 /dir1/dir2/t11
 /dir1/dir2/ss11.c
\*/
void init(){
 head =newDir\_("/",NULL);
 current = head;
 copyit("ssfs.c","ss");
 copyit("test1","test1");
 struct Dir\_ \* n = mkDir\_("dir1");
 current =n;
 copyit("test1","t1");
 copyit("ssfs.c","ss1.c");
 n = mkDir\_("dir2");
 current =n;
 copyit("test1","t11");
 copyit("ssfs.c","ss11.c");
}

int main1(){
char line[200];
init();
while(1){
fgets(line, 200, stdin);
line[strlen(line)] =0; // remove the CR

//printf("line =%s=\n",line);
if (!strncmp(line,"ls",2)){
 listdir();
}
else
 if (!strncmp(line,"copy",4)){
 char \* src = line+5;
 char \* dest;
 dest = strrchr(line,' ');
 \*dest=0;
 if (dest){
 dest++;
 if (dest-line < strlen(line)){
 printf("error in command\n");
 continue; 
 }
 copyit(src,dest);
 } 
 } 
 else
 if (!strncmp(line,"cat",3)){
 char \* src = line+4;
 catit(src); 
 } 
 else
 if (!strncmp(line,"mkdir",5)){
 char \* src = line+6;
 mkDir\_(src); 
 } 
 

}
return 0;
}
그의 mem\_filesystem.c 내부 코드는 다음과 같습니다.#포함 #포함 #include #include 구조체 Dir\_ {구조체 Dir\_ \* 부모;구조체 List \* dir;char \* name;};구조체 Fil {char \* name;int size;char \* data;};union ListItem{구조체 Fil \* 파일;구조체 Dir\_ \* root;};구조체 List{int type;union ListItem li;구조체 List \* next;};구조체 Dir\_ \* head;구조체 Dir\_ \* current;struct Dir\_\* newDir\_(char \* name,struct Dir\_ \* parent){구조체 Dir\_ \* n = malloc(sizeof(구조체 Dir\_));n->parent = 부모;n->dir = NULL;n->name = (char \*)malloc(strlen(name)+1);strcpy(n->name,name);반환 n;}void listdir(){printf("listdir\n");for (구조체 List\*l=current->dir;l;l=l->next) if (l->type ==0) if (l->li.file) printf("file-- %s\n",l->li.file->name);}void copyit(char \*src,char\*dest){ printf("copyit src=%s= dest=%s=\n",src,dest); 구조체 List \*l = malloc(sizeof(구조체 List)); 구조체 Fil \* f = malloc(sizeof(구조체 Fil)); FILE \*fp; f->name = malloc(strlen(dest)+1); strcpy(f->name,dest);  fp = fopen(src,"r"); if (!fp){ printf("cant open %s\n",src); return; } fseek(fp,0l,SEEK\_END); LONG LEN = FTELL(FTP); printf("len = %ld\n",len); fseek(fp,0l,SEEK\_SET); f->data = malloc((int)len); f->size=(int)len; for (int i=0;i<(int)len;i++) f->data[i] = fgetc(fp);  fclose(fp); l->li.file = f; l->type = 0; L->NEXT = CURRENT->DIR; current->dir=l;}void catit(char \* file){{printf("catit\n");for (구조체 List\*l=current->dir;l;l=l->next) if (l->type ==0 && l->li.file && !strcmp(file,l->li.file->name)){{ 구조체 Fil \*f = l->li.file; printf("found-- %s %d\n",f->name,f->size); for (int i=0;isize;i++) printf("%c",f->data[i]); }}// 디렉토리 트리를 내려가 경로에 있는 파일을 찾습니다.// 반환합니다:// 1) 포함된 디렉토리 Dir\_ // 2) 실제 파일 이름.// 예: 경로가 /dir1/dir2/asdf.h이면// 파일 이름은 asdf.h가 됩니다.// dir2 데이터 구조체에 대한 포인트를 반환합니다.구조체 Dir\_ \* walk(구조체 Dir\_\* n, char \* path,char \*\*filename){ path++; while(1){ if (!strchr(path,'/')){ printf("walk end %s\n",path); \*파일명 = 경로; return n; } else{ char \* p = strchr(path,'/'); if (p){ printf("walk1 %s\n",path); for (구조체 List \*l = n->dir;l;l=l->next){ \*p =0; /\* if (l->type ==1) printf("walk2 path=%s %s===\n",path,l->li.root->name); else printf("walk2 path=%s %s===\n",path,l->li.file->name); \*/ if (l->type == 1 && l->li.root && !strcmp(path,l->li.root->name)){{  printf("걷는 남은 경로 = %s dir = %s\n",p+1,l->li.root->name); 경로 = p+1; n = l->li.root; } \*p='/'; } } else 반환 n; }  }}// 파일의 전체 경로를 가져옵니다. 디렉터리일 수도 있고 일반 파일일 수도 있습니다.// 파일과 파일 크기에 대해 1을 반환합니다.// 디렉터리의 경우 2를 반환합니다.int statit(char \*name,int \*psize){printf("statit %s\n",name); \*psize=0; char \* file=NULL; 구조체 Dir\_ \* n = walk(head,name,&file); printf("이후 %s %s\n",n->name,file); if (!file){ printf("워크가 %s\n을 찾지 못했습니다.",name); 반환 0; } // 경로에서 추출한 디렉토리 데이터 구조와 파일명을 가지고 있습니다. for (구조체 List\*l=n->dir;l;l=l->next) if (l->type ==0 && l->li.file && !strcmp(file,l->li.file->name)){{ 구조체 Fil \*f = l->li.file; printf("found-- %s %d\n",f->name,f->size); \*psize=f->size; 반환 1; } else if (l->type ==1 && l->li.root && !strcmp(file,l->li.root->name)){ 구조체 Dir\_ \*n = l->li.root; printf("found dir-- %s \n",n->name); 반환 2; }}// 파일에서 일부 내용을 읽습니다.// 파일의 전체 경로를 가져옵니다. 디렉터리일 수도 있고 일반 파일일 수도 있습니다.// 파일이면 파일의 오프셋부터 버퍼를 채웁니다.int do\_read( char \*path, char \*buffer, size\_t 크기, off\_t 오프셋, 구조체 fuse\_file\_info \*fi){int i=0; printf( "--> %s, %d, %d\n을 읽으려는 중", 경로, (int)오프셋, (int)크기 ); char \* file=NULL; 구조체 Dir\_\* d = walk(head,path,&file); printf("이후 %s %s\n",d->name,file);  /\* TODO  d->dir이 지정한 목록에서 파일을 찾습니다.  파일의 내용을 버퍼에 복사합니다. 복사된 양을 반환합니다. \*/ char buf[400]; sprintf(buf,"경로=%s=파일=%s=헬로 월드\n",경로,파일); int sz = strlen(buf); // 파일에 몇 가지 더미를 넣습니다. for (i=0;i %s\n", 경로의 파일 목록을 가져옴 );  filler( buffer, ".", NULL, 0 ); // 현재 디렉토리 filler( buffer, "..", NULL, 0 ); // 상위 디렉토리 char \* file=NULL; 구조체 Dir\_\* d = walk(head,path,&file); printf("이후 %s %s\n",d->name,file);  // 입력은 dir1/dir2가 될 수 있습니다. // d는 dir1 데이터 구조를 가리킵니다. // 파일은 dir2입니다 // dir2 데이터 구조를 찾아야 합니다. if (\*파일){ for (구조체 List\*l=d->dir;l;l=l->next){ if (l->type ==1 && l->li.root&& !strcmp(file,l->li.root->name)){ d = l->li.root; printf("\*\*\*\*readdir found dir-- %s\n",d->name); } } }  for (구조체 List\*l=d->dir;l;l=l->next){ if (l->type ==0 && l->li.file ){ 구조체 Fil \*f = l->li.file; printf("read dir found-- %s %d\n",f->name,f->size); 필러( 버퍼, f->이름, NULL, 0 ); } else if (l->type