2022年C编程实现文件复制 .pdf





《2022年C编程实现文件复制 .pdf》由会员分享,可在线阅读,更多相关《2022年C编程实现文件复制 .pdf(12页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、操作系统实验之linux 系统调用实现文件拷贝(2009-04-28 19:50:30) 转载标签:it分类:大学课程呵呵,想了想,为了防止写的东西丢了,还是将它们备份新浪的服务器上了吧。实验一看标题也就会知道了,就是在linux下通过系统调用来实现文件的copy 功能,程序代码也是比较简单,还是贴出来吧,同时也和网上的朋友们分享下吧:#include #include #include #include / contain some defined types #include / contain some mod #include / err stream int main( int ar
2、gc, 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 ope
3、n 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 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 12 页 - - -
4、- - - - - - 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,bu
5、ffer,write_bytes)read_inode读取目标文件的磁盘I 节点 (这一步再往下就是由设备驱动完成了,通过调用驱动程序的read 函数读取磁盘 I 节点) ,read_inode 函数的主要功能是初始化inode 的一些私有数据 (比如数据存储位置,文件大小等等)以及给inode_operations函数开关表赋值,最终该inode 被绑定在一个目录缓存结构dentry 中返回。在获得了文件的inode 之后,对于该文件的其它一切操作都有了根基。因为可以从 inode 获得文件操作函数开关表file_operatoins ,该开关表里给出了标准的文件 I/O 接口的实现, 包括
6、 read, write, lseek, mmap, ioctl等等。这些函数入口将是所有关于文件的系统调用请求的最终处理入口,通过这些函数入口会向存储该文件的硬设备驱动发出请求并且由驱动程序返回数据。当然这中间还会牵涉到一些关于 buffer 的管理问题,这里就不赘述了。通过讲述这些,我们应该明白了为什么可以使用统一的系统调用接口来访问不同文件系统类型的文件了:因为在文件系统的实现一层,都把低层的差异屏蔽了,用户可见的只是高层可见的一致的系统调用接口。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - -
7、 - - - 第 3 页,共 12 页 - - - - - - - - - 5. 与 module相关的系统调用Linux 中提供了一种动态加载或卸载内核组件的机制模块。通过这种机制 Linux 用户可以为自己可以保持一个尽量小的内核映像文件,另外,往内核中加载和卸载模块不需要重新编译整个内核以及引导机器。可以通过一定的命令或者调用在一个运行的系统中加载模块,在不需要时卸载模块。模块可以完成许多功能,比如文件系统、设备驱动,系统支持的执行文件格式,甚至系统调用和中断处理都可以用模块来更新。Linux中 提 供 了 往 系 统 中 添 加 和 卸 载 模 块 的 接 口 , create_mod
8、ule() ,init_module (), delete_module() ,这些系统调用通常不是直接为程序员使用的,它们仅仅是为实现一些系统命令而提供的接口,如insmod, rmmod , (在使用这些系统调用前必须先加载目标文件到用户进程的地址空间,这必须由目标文件格式所特定的库函数 (如:libobj.a 中的一些函数 )来完成) 。Linux 的核心中维护了一个module_list 列表,每个被加载到核心中的模块都在其中占有一项,系统调用create_module() 就是在该列表里注册某个指定的模块, 而 init_module 则是使用模块目标文件内容的映射来初始化核心中注册
9、的该模块,并且调用该模块的初始化函数,初始化函数通常完成一些特定的初始化操作,比如文件系统的初始化函数就是在操作系统中注册该文件系统。delete_module则是从系统中卸载一个模块,其主要工作是从module_list中删除该模块对应的module 结构并且调用该模块的cleanup 函数卸载其它私有信息。BackLinux 中怎样编译和定制内核1. 编译内核前注意的事项检查系统上其它资源是否符合新内核的要求。在linux/Document目录下有一个叫Changes 的文件,里面列举了当前内核版本所需要的其它软件的版本号,- Kernel modutils 2.1.121 ; insmo
10、d -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.*. . . . . .其中最后一项是列举该软件版本号的
11、命令,如果不符合要求先给相应软件升级,名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 12 页 - - - - - - - - - 这一步通常可以忽略。2. 配置内核使用 make config 或者 make menuconfig, make xconfig配置新内核。其中包括选择块设备驱动程序、网络选项、网络设备支持、文件系统等等,用户可以根据自己的需求来进行功能配置。每个选项至少有“y”和“ n”两种选择,选择“y”表示把相应的支持编译进内核,选“n”表示不提供这种
12、支持,还有的有第三种选择“ m”,则表示把该支持编译成可加载模块,即前面提到的module ,怎样编译和安装模块在后面会介绍。这里,顺便讲述一下如何在内核中增加自己的功能支持。假如我们现在需要在自己的内核中加入一个文件系统tfile,在完成了文件系统的代码后,在linux/fs 下建立一个 tfile 目录,把源文件拷贝到该目录下,然后修改 linux/fs 下的 Makefile ,把对应该文件系统的目标文件加入目标文件列表中,最后修改 linux/fs/Config.in文件,加入bool tfile fs support CONFIG_TFILE_FS或者tristate tfile f
13、s support CONFIG_TFILE_FS这样在 Make menuconfig时在 filesystem 选单下就可以看到 tfile fs support一项了3. 编译内核在配置好内核后就是编译内核了,在编译之前首先应该执行make dep 命令建立好依赖关系, 该命令将会修改 linux 中每个子目录下的 .depend 文件,该文件包含了该目录下每个目标文件所需要的头文件(绝对路径的方式列举)。然后就是使用 make bzImage命令来编译内核了。该命令运行结束后将会在linux/arch/asm/boot/ 产生一个名叫 bzImage 的映像文件。4. 使用新内核引导把
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年C编程实现文件复制 2022 编程 实现 文件 复制

限制150内