2017-4-26
实验目的
·熟悉read,write等系统调用的使用
·通过编写程序利用相应的系统调用实现cp命令
实验内容
[基本要求]
编写Linux环境下C程序,使用read,write,close等系统调用
[具体要求]
·使用系统调用编写程序实现cp命令的功能
·代码有注释,提交实验报告
[进一步要求]
·读入输入的文件名
·读入文件路径(绝对路径/相对路径)
·实现cp命令的功能
实验报告
1.细节说明
1)cp命令:用于将一个或多个源文件或者目录复制到指定的目的文件或目录。它可以将单个源文件复制成一个指定文件名的具体的文件或一个已经存在的目录下。
可能涉及的系统调用:create、open、close、write、read.
2)open:打开一个已经存在的文件(普通文件、特殊文件或命名管道),或创建一个新文件,但它只能创建普通文件。
定义:
intopen(const char *pathname, int flags);
intopen(const char *pathname, int flags, mode_t mode);
返回值:成功返回新分配的文件描述符,出错返回-1并设置errno
pathname参数:要打开或创建的文件名,和fopen一样,pathname既可以是相对路径也可以是绝对路径。
flags参数:有一系列常数值可供选择,可以同时选择多个常数用按位或运算符连接起来,所以这些常数的宏定义都以O_开头,表示or。
必选项:以下三个常数中必须指定一个,且仅允许指定一个。
O_RDONLY只读打开
O_WRONLY只写打开
O_RDWR可读可写打开
第三个参数mode指定文件权限,可以用八进制数表示,比如0644表示用户具有读写权限,组用户和其它用户具有只读权限
3)close:关闭一个已打开的文件
定义
intclose(int fd);
返回值:成功返回0,出错返回-1并设置errno
参数fd是要关闭的文件描述符。需要说明的是,当一个进程终止时,内核对该进程所有尚未关闭的文件描述符
4)create:使用creat函数创建一个新文件,如果原来该文件存在,会将这个文件的长度截短为0
intcreate(const char * pathname, mode_t mode);
如果成功则返回为只写打开的文件描述符,出错则返回-1。
该函数用于创建一个新文件,等效于
open(pathname,O_WRONLY | O_CREAT | O_TRUNC, mode)
2.完成情况:
可以做到:读入输入的文件名、读入文件路径(包括绝对和相对)、实现cp命令功能(暂时实现一对一的复制)
3.设计思路
设计一个缓冲区,用open打开源文件,将文件内容读取到缓冲区中,再将缓冲区的内容写进目标文件(用create创建的)根据调用的返回值判断是否成功。
4.实验结果
相对路径寻找文件
绝对路径寻找文件
5.实验中遇到的问题
输入绝对路径时经常报错
解决方案:原来是windows路径名和linux路径名有差别的问题
在Unix/Linux中,路径的分隔采用正斜杠"/",比如"/home/hutaow";而在Windows中,路径分隔采用反斜杠"\",比如"C:\Windows\System"。
补充:
以下面这些开头的路径是绝对路径:
UNC名字,两个反斜杠开头\\
盘符冒号加反斜杠开头,例如C:\
一个反斜杠开头,例如\file.txt