




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
操作系统实验之linux系统调用实现文件拷贝 (2009-04-28 19:50:30)转载标签: it分类: 大学课程 呵呵,想了想,为了防止写的东西丢了,还是将它们备份新浪的服务器上了吧。实验一看标题也就会知道了,就是在linux下通过系统调用来实现文件的copy功能,程序代码也是比较简单,还是贴出来吧,同时也和网上的朋友们分享下吧:#include #include#include #include / contain some defined types #include / contain some mod#include / err streamint main( int argc, char* argv ) const int Buffer_Size=20; char bufferBuffer_Size; int from_fd,to_fd ; int write_bytes; if(argc!=3) fprintf(stderr,Wrong Format !n); return -1; /Sys call to open the source file from_fd=open( argv1,O_RDONLY ); /if fail in open the source file if(from_fd=-1) fprintf(stderr,fail in open the source filen); return -1; /open the destnation file ,and if file exsits ,to_fd will be ok to_fd=open(argv2, ); char ch; if(to_fd!=-1) fprintf(stderr,destnation file exists!Do you Want To OverWrite It!(Y/N)n); scanf(%c,&ch); if(ch=n | ch=N) fprintf(stderr,copy failed !n); return -1; to_fd=open(argv2,O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR ); if(to_fd=-1) fprintf(stderr,fail in open destnation file!n); return -1; while( (write_bytes=read(from_fd,buffer,Buffer_Size)0) if(write(to_fd,buffer,write_bytes)read_inode读取目标文件的磁盘I节点(这一步再往下就是由设备驱动完成了,通过调用驱动程序的read函数读取磁盘I节点),read_inode函数的主要功能是初始化inode的一些私有数据(比如数据存储位置,文件大小等等)以及给inode_operations函数开关表赋值,最终该inode被绑定在一个目录缓存结构dentry中返回。 在获得了文件的inode之后,对于该文件的其它一切操作都有了根基。因为可以从inode 获得文件操作函数开关表file_operatoins,该开关表里给出了标准的文件I/O接口的实现,包括read, write, lseek, mmap, ioctl等等。这些函数入口将是所有关于文件的系统调用请求的最终处理入口,通过这些函数入口会向存储该文件的硬设备驱动发出请求并且由驱动程序返回数据。当然这中间还会牵涉到一些关于buffer的管理问题,这里就不赘述了。 通过讲述这些,我们应该明白了为什么可以使用统一的系统调用接口来访问不同文件系统类型的文件了:因为在文件系统的实现一层,都把低层的差异屏蔽了,用户可见的只是高层可见的一致的系统调用接口。 5.与module相关的系统调用 Linux中提供了一种动态加载或卸载内核组件的机制模块。通过这种机制Linux用户可以为自己可以保持一个尽量小的内核映像文件,另外,往内核中加载和卸载模块不需要重新编译整个内核以及引导机器。可以通过一定的命令或者调用在一个运行的系统中加载模块,在不需要时卸载模块。模块可以完成许多功能,比如文件系统、设备驱动,系统支持的执行文件格式,甚至系统调用和中断处理都可以用模块来更新。 Linux中提供了往系统中添加和卸载模块的接口,create_module(),init_module (), delete_module(),这些系统调用通常不是直接为程序员使用的,它们仅仅是为实现一些系统命令而提供的接口,如insmod, rmmod,(在使用这些系统调用前必须先加载目标文件到用户进程的地址空间,这必须由目标文件格式所特定的库函数(如:libobj.a中的一些函数)来完成)。 Linux的核心中维护了一个module_list列表,每个被加载到核心中的模块都在其中占有一项,系统调用create_module()就是在该列表里注册某个指定的模块,而init_module则是使用模块目标文件内容的映射来初始化核心中注册的该模块,并且调用该模块的初始化函数,初始化函数通常完成一些特定的初始化操作,比如文件系统的初始化函数就是在操作系统中注册该文件系统。delete_module则是从系统中卸载一个模块,其主要工作是从module_list中删除该模块对应的module结构并且调用该模块的cleanup函数卸载其它私有信息。 Back Linux中怎样编译和定制内核1.编译内核前注意的事项 检查系统上其它资源是否符合新内核的要求。在linux/Document目录下有一个叫Changes的文件,里面列举了当前内核版本所需要的其它软件的版本号,- Kernel modutils 2.1.121 ; insmod -V- Gnu C 2.7.2.3 ; gcc -version- Binutils 2.8.1.0.23 ; ld -v- Linux libc5 C Library 5.4.46 ; ls -l /lib/libc*- Linux libc6 C Library 2.0.7pre6 ; ls -l /lib/libc*- Dynamic Linker (ld.so) 1.9.9 ; ldd -version or ldd -v- Linux C+ Library 2.7.2.8 ; ls -l /usr/lib/libg+.so.*. . . . . .其中最后一项是列举该软件版本号的命令,如果不符合要求先给相应软件升级,这一步通常可以忽略。2.配置内核 使用make config或者make menuconfig, make xconfig配置新内核。其中包括选择块设备驱动程序、网络选项、网络设备支持、文件系统等等,用户可以根据自己的需求来进行功能配置。每个选项至少有“y”和“n”两种选择,选择“y”表示把相应的支持编译进内核,选“n”表示不提供这种支持,还有的有第三种选择“m”,则表示把该支持编译成可加载模块,即前面提到的module,怎样编译和安装模块在后面会介绍。 这里,顺便讲述一下如何在内核中增加自己的功能支持。 假如我们现在需要在自己的内核中加入一个文件系统tfile,在完成了文件系统的代码后,在linux/fs下建立一个tfile目录,把源文件拷贝到该目录下,然后修改linux/fs下的Makefile,把对应该文件系统的目标文件加入目标文件列表中,最后修改linux/fs/Config.in文件,加入bool tfile fs support CONFIG_TFILE_FS或者tristate tfile fs support CONFIG_TFILE_FS这样在Make menuconfig时在filesystem选单下就可以看到 tfile fs support一项了3.编译内核 在配置好内核后就是编译内核了,在编译之前首先应该执行make dep命令建立好依赖关系,该命令将会修改linux中每个子目录下的.depend文件,该文件包含了该目录下每个目标文件所需要的头文件(绝对路径的方式列举)。 然后就是使用make bzImage命令来编译内核了。该命令运行结束后将会在linux/arch/asm/boot/产生一个名叫bzImage的映像文件。4.使用新内核引导 把前面编译产生的映像文件拷贝到/boot目录下(也可以直接建立一个符号连接,这样可以省去每次编译后的拷贝工作),这里暂且命名为vmlinuz-new,那么再修改/etc/lilo.conf,在其中增加这么几条:image = /boot/vmlinuz-newroot = /dev/hda1label = newread-only并且运行lilo命令,那么系统在启动时就可以选用新内核引导了。5.编译模块和使用模块在linux/目录下执行make modules编译模块,然后使用命令make modules_install来安装模块(所有的可加载模块的目标文件会被拷贝到/lib/modules/2.2.12/),这样之后就可以通过执行insmod 模块名和rmmod模块名命令来加载或卸载功能模块了。 linux下的C编程实现文件复制的方法2010-08-21 14:37:01 作者:佚名 来源: 浏览次数:68系统调用:系统调用:#include/data types in this system#include/file state define S_IWUSR#include /file control#define MAX_SIZE 1024int main(int argc, char *argv) int in, out; int nead=0; char bufferMAX_SIZE; if(argc != 3) printf(Usage: command file1 file2 ); return 1; in =open(argv1, O_RDONLY,S_IRUSR);/lost mode: S_IRUSR out =open(argv2, O_WRONLY|O_CREAT|O_TRUNC, S_IWUSR|S_IXUSR); while(nead =read(in, buffer, MAX_SIZE)0) write(out, buffer, nead); exit(0);/标准库函数实现#include#include#define MAXSIZE 1024int main(int argc,char* argv) FILE* in,* out; char bufferMAXSIZE+1; int n; if(argc != 3) printf(Usage:commad file1 file2 ); return 1; in = fopen(argv1,r); out = fopen(argv2,w); if(in = NULL | out = NULL) printf(Cannt find file! ); return 2; while(n=fread(buffer,sizeof(char),MAXSIZE,in)0) fwrite(buffer,sizeof(char),n,out); exit(0); /*only use to read non-binary files*/#include #include#include#define MAXSIZE 100extern int errno;int main(int argc,char* argv) char bufferMAXSIZE; FILE *in, *out; if(argc != 3) printf(Useage: comand filename1 filename2 ); return 0; in = fopen(argv1,r); out = fopen(argv2,w); while(fgets(buffer,MAXSIZE,in)!=NULL)/if read a null value,fgets function will tunminate if(errno!=0) printf(An error has occured! The value of errno is:%d ,errno); if(fputs(buffer,out)=EOF) printf(An error has occured! ); exit(0);linux下的C编程实现文件复制分类:C/C+2007.1.18 15:28 作者:virtualempire | 评论:2 | 阅读:2086系统调用:#include/data types in this system#include/file state define S_IWUSR#include /file control#define MAX_SIZE 1024 int main(int argc, char *argv) int in, out; int nead=0; char bufferMAX_SIZE; if(argc != 3) printf(Usage: command file1 file2n); return 1; in =open(argv1, O_RDONLY,S_IRUSR);/lost mode: S_IRUSR out =open(argv2, O_WRONLY|O_CREAT|O_TRUNC, S_IWUSR|S_IXUSR); while(nead =read(in, buffer, MAX_SIZE)0) write(out, buffer, nead); exit(0); /标准库函数实现#include#include#define MAXSIZE 1024 int main(int argc,char* argv) FILE* in,* out; char bufferMAXSIZE+1; int n; if(argc != 3) printf(Usage:commad file1 file2n); return 1; in = fopen(argv1,r); out = fopen(argv2,w);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年专业技术人员继续教育公需课试题库及参考答案
- 2025年(CPA)注册会计师全国统一考试《税法》考前练习题及答案
- 2025年高院遴选面试题及答案
- 2025年国家工作人员学法用法考试题库及答案
- 2025年广东省河源市导游资格全国导游基础知识模拟题(附答案)
- 2025年大学移民管理专业题库-、移民个人信息保护与通信安全
- 2025年初中学业水平考试地理模拟试卷:乡土地理特色试题解析与答案集
- 2025年电工(高级)试题库(含答案)
- 2025年大学社会体育指导与管理专业题库- 城市体育设施规划与管理
- 2025年大学国内安全保卫专业题库- 大学国内安全保卫专业实践教学模式研究
- 工程居间合同范本电子版可打印
- 水平定向钻施工方案(专家论证)
- 2024至2030年中国扇数据监测研究报告
- 2024-2030年中国化工新材料行业需求趋势及发展可行性分析报告
- 中煤集团公司职称计算机试卷高级
- DB35T 772-2023 行业用水定额
- 心血管内科介入管理制度、岗位职责及工作流程
- 浙江省宁波市鄞州区曙光中学2024-2025学年九年级上学期10月月考科学试卷(1-3章)
- 2026年全年日历表带农历(A4可编辑可直接打印)预留备注位置
- 载人航天术语
- 2024年高考英语训练动词(谓语、非谓语)单句语法填空50题
评论
0/150
提交评论