本文转自:http://edsionte.com/techblog/archives/850
今天陈老师对我们以后Linux的学习做了些指导,一针见血的指出我们学习中经常会遇到的问题。我大概记了一下:
1.从有需求做起,不要盲目看书。
2.有计划,有步骤的学习。
3.主动学习,学会分享。
暂不说其他,我觉得第1条在我们学习过程中很值得注意。前段时间做了my_ls.c和my_shell.c。虽然都调试成功,但还是极大的参考了《linuxC编程实战》这本书。因为文件系统在linux中占据着重要地位,所以还是得多通过实践来理解这部分的内容,不妨大家和我一起做my_cp,练习一下文件操作这部分的系统调用函数。
既然我们要实现cp命令,必须得了解cp命令的基本使用方法。这方面的资料网上很多,并且可以参考man手册自己试试,在此我不再详细说明。my_cp将要实现以下基本的功能:
1.将一个文件拷贝到指定路径。(目的文件可存在也可不存在)。这是my_cp中最基本的功能,事实上2,3,4功能最终都会被分解成此功能。
2.将一个目录拷贝到指定目录下,此时必须加-R或-r选项。
3.将多个目录拷贝到指定目录下,此时必须加-R或-r选项。
4.将多个文件拷贝到指定目录下。这里的源文件即包含目录文件也包含普通文件。
个人建议,最好多在终端试试以上各种情况,重点看一看cp命令是如何处理非法命令的,这对我们下面的编程有帮助。
请注意,原文件中如果存在目录文件,并且输入的命令行参数未加-r或-R选项,则会自动忽略此源目录文件,而其他文件的拷贝不受影响。如:
if(src_num>\1)
{
//The code here be omited
}
else
{
//only one src path
if(stat(src_path[0],&buf)==-1)
{
printf("my_cp: can't get file status of \"%s\" : no this file or directory.\n",src_path[0]);
exit(1);
}
if(S_ISDIR(buf.st_mode))
{
if(param_r)
{
cp_directory(src_path[0],dest_path);
exit(0);
}
else
{
printf("my_cp: skip the directory: \"%s\".\n",src_path[0]);
exit(1);
}
}
else
{
cp_single(src_path[0],dest_path);
}
}
好了,主函数部分基本就是这样,这里主要说明整个主函数的整个流程。另外我们也应该不走寻常路,去尝试一些错误情况,这有利于我们编程。