实现cp命令(5)
时间:2010-08-09 来源:edsionte
晚上7点多给3+1班和linux兴趣小组的同学讲解了my_cp的实现过程。整体还算可以,不过我个人感觉还是有点紧张,个别之处讲的不是很清楚。有时候竟然声音都破音了! e43 看来以后要多锻炼锻炼!不能只会写不会说!我不要做刘永苹(这位老师理论知识充裕,但是表达严重不靠谱)!
1.讲解过程中有一位同学提出这样的问题:当源文件是*.c这样的形式时,my_cp可以正确执行吗。
我当时有点犯傻,的确我在做my_cp的过程中并没有想到这个问题,但是我刚试了以下是可以成功执行的。比如:
gues@huangwei-desktop:~/code/shell_command$ ./my_cp *.c newdir/ gues@huangwei-desktop:~/code/shell_command$ ls -l newdir/ 总用量 64 -rw-r--r-- 1 gues gues 7799 2010-08-04 21:06 cp_plus2.c -rw-r--r-- 1 gues gues 1377 2010-08-04 21:06 e 3_6.c -rw-r--r-- 1 gues gues 0 2010-08-04 21:06 my_cat.c -rw-r--r-- 1 gues gues 5327 2010-08-04 21:06 my_chmod.c -rw-r--r-- 1 gues gues 7881 2010-08-04 21:06 my_cp.c -rw-r--r-- 1 gues gues 7378 2010-08-04 21:06 my_ls.c -rw-r--r-- 1 gues gues 6271 2010-08-04 21:06 my_shell.c -rw-rw-rw- 1 gues gues 0 2010-08-04 21:06 test2.c -rw-r--r-- 1 gues gues 7 2010-08-04 21:06 test.c -rw-r--r-- 1 gues gues 7378 2010-08-04 21:06 tfile.c -rw-r--r-- 1 gues gues 6271 2010-08-04 21:06 ttfile.c
既然可以成功,那么它到底通向my_cp四个功能中的哪一个?从指令形式上看,貌似只有一个源文件:*.c。但是事实上这个指令的功能是将多个文件拷贝到指定目录。最后我通过调试一下就得到了答案!我在主函数一开是就加入了断点:
for(i=1;i<\argc;i++)//断点处 { //the code here was omited }
然后我打印argc的值,显示为13!数数上面的.c文件刚好11个,加上./my_cp和dir刚好13个参数。那么答案就是:*.c在输入后,系统自动就查找符合条件的文件,并“暗自“添加到命令中。因此上面的命令等同于:
./my_cp cp_plus2.c my_ls.c test.c ttfile.c e 3_6.c my_cat.c my_chmod.c my_cp.c my_shell.c test2.c tfile.c dir/
2.今天(8/5)woody同学留言说,当出现./my_cp test.c ./././test.c时候,如何处理其错误显示?
这个问题在我的my_cp中没有做到。但是要避免这个问题也不难。在cp_single函数中,当我们判断了目的文件存在时(源文件肯定存在,因为在主函数中已经判断过),可以加入这一段:
if(stat(src_path,&src_buf)!=0) { printf("In cp_single:open src_file error.\n"); return; } if(src_buf.st_ino==buf.st_ino) { printf("my_cp: \"%s\"和\"%s\"为同一文件\n",src_path,dest_path); return ; }
主要思想就是分别获取源和目的文件的属性,再去比较st_ino(文件i节点编号)是否相同。另外还要在cp_directory函数中也要加入类似的代码,因为cp命令是不能将本目录拷贝到本目录下的。