




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验5 Linux文件管理学校:FJUT 学号:3131903229 班级:计算机1302 姓名:姜峰注:本次实验为了简化操作,均采用指定文件名和目录名,其中路径也为指定路径。一. 实验学时与类型学时:2,课外学时:自定实验类型:验证、设计性实验二. 实验目的(1) 了解操作系统文件系统的工作原理和工作方式;(2) 了解文件和目录操作的系统调用用户接口;(3) 了解Linux提供的文件系统调用的使用方法。三. 实验内容(1)利用Linux有关系统调用函数编写一个文件工具filetools,要求具有下列功能:功能命令行0. 退出exit1. 创建新文件createfile filename2.
2、写文件write filename3. 读文件read filename4. 复制文件Copy srcname,dstname 5. 修改文件权限chmod filename mode6. 查看文件权限lsmod filename7. 创建目录createdir pathname8. 查看目录ls pathname9. 删除目录rmdir pathpame10. 切换当前目录cd pathname11 建立符号链接ln file sysfile具体编程实现时,可以以菜单方式(左栏)提供功能选择,也可以按命令行方式(右栏)动态输入有关命令。头文件:#include<stdio.h>#
3、include<string.h>#include<sys/types.h>#include<unistd.h>#include<fcntl.h>#include<sys/stat.h>#include<syslog.h>#include<stdlib.h>主界面源码:int main() int n; while( 1 ) printf( "0. 退出n1. 创建新文件n2. 写文件n3. 读文件n4. 复制文件n" ); printf( "5. 修改文件权限n6. 查看文件权限
4、n7. 创建子目录8. 查看目录n" ); printf( "9. 删除子目录n10. 改变当前目录到指定目录n11. 建立符号链接n" ); printf( "Please Input Your Choice:" ); scanf( "%d", &n ); switch ( n ) case 0 : Quit(); break; case 1 : CreateFile(); break; case 2 : WriteInFile(); break; case 3 : ReadInFile(); break; cas
5、e 4 : CopyFile(); break; case 5 : AlterFileAuthority(); break; case 6 : ViewFileAuthority(); break; case 7 : CreateSubdirectory(); break; case 8 : ViewFilePathname(); break; case 9 : DeleteSubdirectory(); break; case 10: CdToDestination(); break; case 11: LinkOperating(); break; default: printf( &qu
6、ot;You have a wrong choice!n" ); printf( "n" ); return 0;实验过程截图:0. 退出源码:void Quit() /0. 退出 exit(0);1. 创建新文件原来文件夹中的文件:创建了一个为空的jiangfeng.c:源码:void CreateFile() /1. 创建新文件 int fp; if( ( fp = open( "/home/test5/jiangfeng.c", O_CREAT | O_TRUNC | O_RDWR, 0666 ) ) < 0 ) perror( &
7、quot;open" ); else printf( "Create file:" ); getchar(); if( close( fp ) < 0 ) perror( "close" ); else printf( "Close file:" ); 2. 写文件向jiangfeng.c中写入数据:打开jiangfeng.c查看:源码:void WriteInFile() /2. 写文件 int fp; char buf1024; if( ( fp = open( &q
8、uot;/home/test5/jiangfeng.c", O_CREAT | O_APPEND | O_RDWR, 0666 ) ) < 0 ) perror( "open" ); else printf( "Open file:" ); printf( "Please input your data( < 1024 bytes ) :n" ); scanf( "%s", buf ); if( write( fp, buf, strlen( buf ) ) <
9、0 ) perror( "write" ); else printf( "Written Success!n" ); getchar(); if( close( fp ) < 0 ) perror( "close" ); else printf( "Close file:" ); 3. 读文件从jiangfeng.c中读数据:再次写入一段数据:再次从文件中读数据发现刚才的数据附在末尾,表面写数据是从文件末尾开始写的:源码:void ReadInFile() /3. 读文件 int fp
10、; char *buf; int front, rear; if( ( fp = open( "/home/test5/jiangfeng.c", O_RDWR, 0666 ) ) < 0 ) perror( "open" ); else printf( "Open file:" ); getchar(); rear = lseek( fp, 0, SEEK_END ); front = lseek( fp, 0, SEEK_SET ); /设置文件指针位置 front = rear - front; b
11、uf = ( char * ) malloc( front ); if( read( fp, buf, front+1 ) < 0 ) perror( "read" ); else printf( "Read Success!n" ); printf( "%sn", buf ); getchar(); if( close( fp ) < 0 ) perror( "close" ); else printf( "Close file:" ); 4. 复制文件在本
12、目录下又创建一个jiangfengcopy.c的文件并将jiangfeng.c的数据copy到其中观察jiangfengcopy.c的数据与jiangfeng.c数据对比:源码:void CopyFile() /4. 复制文件 int fp, fd; char *buf; int front, rear; if( ( fp = open( "/home/test5/jiangfeng.c", O_RDWR, 0666 ) ) < 0 ) perror( "open" ); else printf( "Open file:jiangfeng
13、.cn" ); getchar(); rear = lseek( fp, 0, SEEK_END ); front = lseek( fp, 0, SEEK_SET ); /设置文件指针位置 front = rear - front; buf = ( char * ) malloc( front ); if( read( fp, buf, front+1 ) < 0 ) perror( "read" ); printf( " Copy Error!n" ); else if( ( fd = open( "/home/test5/
14、jiangfengcopy.c", O_CREAT | O_TRUNC | O_RDWR, 0666 ) ) < 0 ) perror( "open" ); printf( " Copy Error!n" ); if( write( fd, buf, strlen( buf ) ) < 0 ) perror( "write" ); printf( " Copy Error!n" ); else printf( "Copy from jiangfeng.c to jiangfengco
15、py.c Success!n" ); getchar(); if( close( fp ) < 0 | close( fd ) < 0 ) perror( "close" ); else printf( "Close file:jiangfeng.c and " ); 5. 修改文件权限 以及 查看文件权限先查看原本文件权限:再修改文件权限:已改为“读”权限:源码:void AlterFileAuthority() /5. 修改文件权限 int n;printf( "0. 读,写,执行 1.
16、 读 2. 写 3. 执行n" );printf( "Please Input Your Choice:" );scanf( "%d",&n );switch( n ) case 0 : chmod( "/home/test5/jiangfeng.c", S_IRWXU ); break; /读,写,执行case 1 : chmod( "/home/test5/jiangfeng.c", S_IRUSR ); break; /读case 2 : chmod( "/home/test5/j
17、iangfeng.c", S_IWUSR ); break; /写case 3 : chmod( "/home/test5/jiangfeng.c", S_IXUSR ); break; /执行default: printf( "You have a wrong choice!n" );void ViewFileAuthority() /6. 查看文件权限 char *path = "/bin/ls"char *argv4 = "ls", "-l", "/home/test5
18、/jiangfeng.c", NULL; execv( path,argv );/执行ls l jiangfeng.c6. 创建子目录可看到目录中出现jiangfeng的子目录:源码:void CreateSubdirectory() /7. 创建子目录 if( mkdir( "/home/test5/jiangfeng", S_IRWXU ) < 0 ) perror( "mkdir" ); else printf( "Create Success!n" ); 7. 查看目录查看当前目录下的文件:源码:void Vi
19、ewFilePathname() /8.查看目录 char *path = "/bin/ls"char *argv4 = "ls", "-l", NULL; execv( path,argv );/执行ls l8. 删除子目录观察后,发现已将jiangfeng子目录删除:源码:void DeleteSubdirectory() /9. 删除子目录 if( rmdir( "/home/test5/jiangfeng" ) < 0 ) perror( "rmdir" ); else print
20、f( "Delete Success!n" ); 9. 改变当前目录到指定目录(到test3中)查看当前目录下文件,说明已经转到test3下。源码:void CdToDestination() /10. 改变当前目录到指定目录 if( chdir( "/home/test3" ) < 0 ) perror( "chdir" ); else printf( "Update Success!n" ); 10. 建立符号链接建立一个名为jiang.c的链接查看目录,发现链接已建立:源码:void LinkOpera
21、ting() /11. 建立符号链接 if( link( "jiangfeng.c","jiang.c" ) < 0 ) perror( "link" ); else printf( "Create Successn"); (2) 利用winhex工具解析FAT文件系统格式,并给出文件系统类型有关分析数据。提示:由于磁盘容量通常较大,可选择一个小容量U盘进行分析。(选做)我采用u盘详情如下:此图为winhex分析后的主界面:启动扇区放在物理空间的第一个地址:FAT1区:FAT2区:容量备用区:剩余空间区:这些
22、为u盘内数据(删除后的文件均为半透明显示):对于FAT32系统格式详情请参考四. 相关实验指导1文件系统调用(1) 打开或新建文件系统调用open函数int open(const char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode);int creat(const char *pathname, mode_t mode);【与int open(pathname,O_WRONLYO_CREAT|O_TRUNC, mode); 作用相同】参数说明: pathname:要打开或新
23、建的文件名称。 flags:标志位,指定打开文件的操作方式及打开时的一些行为。O_RDONLY-只读 O_WRONLY只写 O_RDWR可读可写还可以用或运算对下列标志进行组合O_CREAT-如果文件不存在则创建,存在则不再创建O_TRUNC-如果文件已存在,则清除文件原有内容O_EXECL-如果文件已存在,又设置了O_CREAT,则强制open失败O_APPEND-每次写入时从文件尾部开始。例:创建一个可读可写的文件file1,可用fd=open(“file1”,O_CREAT|O_RDWR); mode: 用于指定新文件的权限标志位。如果打开时使用了O_CREAT标
24、志创建新文件,则一般都要给出mode参数,它的一些常用取值如下所示,这些值可以用按位或的方式组合使用。新文件的所属用户和所属组则是创建它的进程的所属用户和所属组。 权限标志定义 对应的八进制值 含义 S_IRWXU 00700 文件所属用户有读写和执行权限 S_IRUSR(S_IREAD) 00400 文件所属用户有读权限 S_IWUSR(S_IWRITE) 00200
25、; 文件所属用户有写权限 S_IXUSR(S_IEXEC) 00100 文件所属用户有执行权限 S_IRWXG 00070 组内用户有读写和执行权限 S_IRGRP 00040 组内用户有读权限 S_IWGRP 00020 组内用户有写权限&
26、#160;S_IXGRP 00010 组内用户有执行权限 S_IRWXO 00007 其他用户有读写和执行权限 S_IROTH 00004 其他用户有读权限 S_IWOTH 00002 其他用户有写权限 S_IXOTH
27、;00001 其他用户有执行权限 返回值:操作成功则返回文件描述符,否则返回-1并设置标量errno的值。(2) ssize_t read(int fd, void *buf, size_t count); /读文件中数据(3) ssize_t write(int fd, const void *buf, size_t count); /将数据写入文件(4) int lseek( int fd, offset_t offseet, int whence ); /文件读写指针定位origin:SEEK_CUR当前位置、SEEK_SET文件
28、开始、SEEK_END文件尾(5) int close(int fd); /关闭文件(6) int chmod(char *pathname, mode_t mode); /更改文件权限mode参数与open函数中的mode参数相同(7) int mkdir(const char *path,mode_t mode); /mode是子目录的权限(8) int rmdir(const char *path); /删除子目录(9) int chdir(const char *path); /切换当前目录(10) DIR* opendir (const char * path ); /打开目录,失败
29、时返回空指针(11) int closedir(DIR *dirp); /关闭已打开的目录(12) struct dirent * readdir(DIR * dir_handle); /读取dir_handle目录下目录项,返回dirent结构体指针,若已无未读目录项返回NULL。 dirent结构体成员如下:struct direntlong d_ino; /inode number 索引节点号off_t d_off; / offset to this dirent 在目录文件中的偏移unsigned short d_reclen; / len
30、gth of this d_name 文件名长unsigned char d_type; / the type of d_name 文件类型char d_name NAME_MAX+1; /文件全名,最长255字符(13) int link(const char *oldpath, const char *newpath); /以newpath为名建立一个硬链接到oldpath,成功返回0,失败为-1。如:link(“etc/passwd”, ”pass”);(14) int symlink(const char *oldpath, const char *newpath);/建立符号链接(1
31、5) int unlink(const char *pathname); /取消指定的链接2文件操作类C语言库函数(1)FILE *fopen(const char *filename, const char *mode);/打开或创建文件参数说明:filename同上面pathname,mode说明如下:r或rb 打开只读文件,b表示二进制文件。r+或rb+ 打开可读写的文件,该文件必须存在。w或wb 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。w+或wb+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
32、a或ab 以附加的方式打开只写文件。若文件不存在,则会建立该文件。a+或ab+ 以附加方式打开可读写的文件。若文件不存在,则会建立文件。由fopen()所建立的新文件会具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH (0666)权限。(2)size_t fwrite(const void*buffer,size_t size,size_t count,FILE*stream); /写文件(3)size_t fread( void*buffer, size_t size, size_t count, FILE*stream ); /读文件(4)
33、int fseek( FILE*stream, long offset, int origin ); /文件读写指针定位origin:SEEK_CUR当前位置、SEEK_SET文件开始、SEEK_END文件尾(5)int fclose(FILE * stream); /关闭文件备注:在实现程序功能时,推荐调用上述函数,当然也可以调用linux相关命令。3. 有关头文件#include<stdio.h>#include<sys/types.h>#include<unistd.h>#include<fcntl.h>#include
34、<sys/stat.h>#include<syslog.h>#include<string.h>#include<stdlib.h>#include<dirent.h>4. 部分参考程序void chmd (char *filename) /设置文件权限int c; mode_t mode=S_IWUSR;printf(" 0. 0700n 1. 0400n 2. 0200 n 3. 0100n "); /还可以增加其它权限printf("Please input your choice(0-3):&qu
35、ot;);scanf("%d",&c);switch(c)case 0: chmod(filename,S_IRWXU);break;case 1: chmod(filename,S_IRUSR);break;case 2: chmod(filename,S_IWUSR);break;case 3: chmod filename,S_IXUSR);break;default:printf("You have a wrong choice!n");void dispmode(char *filename)/查看文件权限char* path=&quo
36、t;/bin/ls"char* argv4="ls","-l",filename,NULL;execv(path,argv);/执行ls l file1void lsdir(char * pathname) /查看目录 DIR *dirptr = NULL;struct dirent *entry;dirptr = opendir(pathname)if(dirptr = NULL)printf("open dir !");return;while (entry = readdir(dirptr)prin
37、tf("%sn", entry->d_name);/* 打印出该目录下的所有内容 */closedir(dirptr);五. 思考与总结(1) 上述Linux的文件系统调用函数在Windows中是否有对应函数?若有,请给出对应函数。Windows下对于文件操作相关API如下:CopyFile 复制文件 CreateDirectory 创建一个新目录 CreateFileMapping 创建一个新的文件映射对象 DeleteFile 删除指定文件 GetFileAttributes 判断指定文件的属性 GetSystemDirectory 取得Windows系统目录(即
38、System目录)的完整路径名 GetTempPath 获取为临时文件指定的路径 GetWindowsDirectory 获取Windows目录的完整路径名 lclose 关闭指定的文件 lcreat 创建一个文件 llseek 设置文件中进行读写的当前位置lread 将文件中的数据读入内存缓冲区 lwrite 将数据从内存缓冲区写入一个文件 LZCopy 复制一个文件 LZRead 将数据从文件读入内存缓冲区 LZSeek 设置一个文件中进行读写的当前位置 ReadFile 从文件中读出数据 RemoveDirectory 删除指定目录 SetCurrentDirectory 设置当前目录
39、SetEndOfFile 针对一个打开的文件,将当前文件位置设为文件末尾 SetFileAttributes 设置文件属性 SetFilePointer 在一个文件中设置当前的读写位置 WriteFile 将数据写入一个文件(2) 请说明系统调用、库函数、操作命令这三者的区别。库函数是高层的,完全运行在用户空间,为程序员提供调用真正的在幕后完成实际事务的系统调用的更方便的接口。系统调用在内核态运行并且由内核自己提供。标准C库函数printf()可以被看做是一个通用的输出语句,但它实际做的是将数据转化为符合格式的字符串并且调用系统调用 write()输出这些字符串。所谓系统调用,就是内核提供的、功能十分强大的一系列的函数。这些系统调用是在内核中实现的,再通过一定的方式把系统调用给用户,一般都通过门(gate)陷入(trap)实现。系统调用是用户程序和内核交互的接口。库函数是对系统调用的封装(不是所有的库函数都是),为的是解决一些公共的问题和提供统一的系统调用的接口,他和系统调用的优缺点就是:系统调用速度是明显要快于库函数(并不一定全部是,但绝大部分是),但系统调用缺乏移植性。库函数速度要慢,但解决了移植问题。而系统命令位于更上层,是利用库函数实现的可执行程序,比
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 文化创意产业项目投资与收益分配协议书
- 经济法概论重要文献试题及答案参考
- 家庭物资管理系统开发协议
- 农村社区土地流转合作协议
- 乡村特色种植区开发协议
- 公共关系学知识要点及试题答案
- 突破传统思维的2025年市政工程考试试题及答案
- 2025年公共关系学创新思维试题及答案
- 开设品德课程提升学生道德水平计划
- 提升信息技术应用能力的方法计划
- 2025年江苏高处安装、维护、拆除作业-特种作业证考试复习题库(含答案)
- 2025年湖北省黄冈市中考数学调研试卷(4月份)
- Unit7OutdoorfunIntegration(课件)-译林版(2024)英语七年级下册
- 2023年船员培训计划
- 2025中国铁路郑州局集团招聘614人(河南)笔试参考题库附带答案详解
- 陪玩店合同协议
- 货运司机雇佣合同协议
- 超合同30签补充协议
- 中国船用集装箱角件行业市场发展前景及发展趋势与投资战略研究报告2025-2028版
- 2025年国家义务教育质量监测中学语文理论考核试题
- 2025年山东省淄博市中考二模地理试题及答案
评论
0/150
提交评论