1.实验目的
(1)掌握Linux提供的文件系统调用的使用方法;
(2)熟悉文件和目录操作的系统调用用户接口;
(3)了解操作系统文件系统的工作原理和工作方式。
2.实验内容
(1) 利用Linux有关系统调用函数编写一个文件工具filetools,要求具有下列功能:
***********
0. 退出
1. 创建新文件
2. 写文件
3. 读文件
4. 复制文件
5. 修改文件权限
6. 查看文件权限
7. 创建子目录
8. 删除子目录
9. 改变当前目录到指定目录
10. 链接操作
***********
代码:
#include #include #include #include #include #include #include #include void menu(void); void openfile(void); void writefile(void); void readfile(void); void copyfile(void); void chmd(void); void ckqx(void); void cjml(void); void scml(void); void ggml(void); void ylj(void); int main() { int choose; int suliangjin=1; menu(); scanf("%d",&choose); while(choose!=0) { switch(choose) { case 1:openfile();break; case 2:writefile();break; case 3:readfile();break; case 4:copyfile();break; case 5:chmd();break; case 6:ckqx();break; case 7:cjml();break; case 8:scml();break; case 9:ggml();break; case 10:ylj();break; } menu(); scanf("%d",&choose); } return 0; } void menu(void) { printf("文件系统\\n"); printf("1.创建新文件\\n"); printf("2.写文件\\n"); printf("3.读文件\\n"); printf("4.复制文件\\n"); printf("5.修改文件权限\\n"); printf("6.查看文件权限\\n"); printf("7.创建子目录\\n"); printf("8.删除子目录\\n"); printf("9.改变目前目录到指定目录\\n"); printf("10.链接操作\\n"); printf("0.退出\\n"); printf("请输入您的选择...\\n"); } void openfile(void) { int fd; if((fd=open("/tmp/hello.c",O_CREAT|O_TRUNC|O_RDWR,0666))<0) perror("open"); else printf("open file:hileo.c %d\\n",fd); if(close(fd)<0) perror("close"); else printf("Close hello.c\\n"); } void writefile(void) { int fd,size,len; char *buf="Hello!I'm writing to this file!"; len=strlen(buf); if((fd=open("/tmp/hello.c",O_CREAT|O_TRUNC|O_RDWR,0666))<0) perror("open"); else printf("open file:hileo.c %d\\n",fd); if((size=write(fd,buf,len))<0) perror("write"); else printf("Write:%s\\n",buf); if(close(fd)<0) perror("close"); else printf("Close hello.c \\n"); } void readfile(void) { int fd,size; char b[10]; if((fd=open("/tmp/hello.c",O_CREAT|O_TRUNC|O_RDWR,0666))<0) perror("open"); else printf("open file:hileo.c %d\\n",fd); lseek(fd,0,SEEK_SET); if((size=read(fd,b,10))<0) perror("read"); else printf("read from file:%s\\n",b); if(close(fd)<0) perror("close"); else printf("Close hello.c\\n"); } void copyfile(void) { if(fork()==0) execlp("/bin/cp else wait(0); printf("将hello.c复制he.c"); } void chmd(void) { int a; printf("1.文件主可读可写可执行\\n"); printf("2.文件主可读\\n"); printf("3.文件主可写\\n"); printf("4.文件主可执行\\n"); printf("请输入您的选项\\n"); scanf("%d",&a); switch(a) { case 1:chmod("/tmp/hello.c",S_IRWXU);printf("ok!\\n");break; case 2:chmod("/tmp/hello.c",S_IRUSR);printf("ok!\\n");break; case 3:chmod("/tmp/hello.c",S_IWUSR);printf("ok!\\n");break; case 4:chmod("/tmp/hello.c",S_IXUSR);printf("ok!\\n");break; default:printf("您选择有误\\n"); } } void ckqx(void) { char *path="/bin/ls"; char *argv[4]={"ls if(fork()==0) execv(path,argv); else wait(0); } void cjml(void) { if(mkdir("/tmp/a",S_IRWXU)<0) perror("Mkdir"); else printf("创建成功\\n"); } void scml(void) { if(rmdir("/tmp/a")<0) perror("Rmdir"); else printf("删除成功\\n"); } void ggml(void) { if(chdir("/tmp/bc")<0) perror("chdir"); else printf("更改目录成功\\n"); } void ylj(void) { if(link("hello.c perror("Link"); else printf("建立硬连接\\n"); } 打开文件: 写文件: 读文件: 复制文件: 修改权限: 查看权限: 创建目录: 删除目录: 更改目录: 硬连接: 问题解决方案: 1.在复制文件时用execlp函数,虽然有复制成功但是他就跳出整个程序,这就是一个缺陷。后来我在execlp前面加if(fork)()==0) 就可以咯 2.硬连接不成功,老是抛出错误信息,后来发现原来是因为我的代码出错,还有我之前已经更改了目录所以就会经常报错 3.到现在还不知道为什么我读出来的是乱码情解决 实验心得体会: 通过这次实验掌握Linux提供的文件系统调用的使用方法;熟悉文件和目录操作的调用用户接口,了解操作系统文件系统的工作原理和工作方式。