晚上7点多给3+1班和linux兴趣小组的同学讲解了my_cp的实现过程。整体还算可以,不过我个人感觉还是有点紧张,个别之处讲的不是很清楚。有时候竟然声音都破音了! 看来以后要多锻炼锻炼!不能只会写不会说!我不要做刘永苹(这位老师理论知识充裕,但是表达严重不靠谱)!
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命令是不能将本目录拷贝到本目录下的。
武学长你好,我是咱们学校 软件0903班 贾威 今天听了你的讲座受益匪浅,我学会了做事要踏踏实实,一步一步,我有点急躁,但是你的cp好像有这样一个问题,就是权限问题,有的文件普通用户和在同一组的用户cp就不能复制,只有root才有权限复制,这点你好像没有,在你讲座期间我没看到你讲这点,在你讲的期间没好意思提出,不好意思。最后感谢你的讲座,谢谢。还有我想和你一起研究,就是大家都在学习linux c,以后可能还要学习其他知识,我想和你多多讨论。准确来说我想和你定期的讨论一些问题,还有你有啥想做的程序,可以分给我,我也可以在组织几个09届在linux兴趣小组的同学,我们可以一起搞啊,不知你是否愿意,我的gmail 是 harryxiyou@gmail.com 我的邮箱是 harryxiyou@163.com,多多联系。
[回复一下]
edsionte 回复:
8月 4th, 2010 at 19:44
给你发163邮箱了。
[回复一下]
edsionte 回复:
8月 4th, 2010 at 19:45
给你发163邮箱了。。
[回复一下]
Hi, Mr. Wu, I’m a member of Linux 3+1 in XUPT…
Last night on Ur Lecture, I learned a lot from U, Later I thought a lot, And I did the ‘cp’ command before(Less function than Urs), so… I tried some error args, Then a BUG comes out, When I did the SRC == DST, my cp did it without any warning, I wonder how did U realized the ERROR-PROMPT, 3x~
[回复一下]
edsionte 回复:
8月 4th, 2010 at 21:23
你好,woody同学。至于错误提示, 我是在做主函数的时候,因为我事先对这个命令不熟悉,就会先想会出现那些情况,然后再用cp去试,我也故意输入一些错误命令,然后看他是如何反应的。基本情况就是这样,其实主要还是你去多了解cp命令,然后你就能提高my_cp的健壮行。
[回复一下]
额,提到刘永平了。。尴尬。。
[回复一下]
edsionte 回复:
8月 4th, 2010 at 21:14
这位老师呢,带过我们网页设计和嵌入式。。结果呢,(也许是巧合)我们这两门课大家都等于没学。。不知道你们如何。。
[回复一下]
刘永平的嵌入式和Linux两们选修课我上过。。。
咱们学校很多茶壶煮饺子的老师,肚子里有货倒不出来的情况已经多见少怪了,不过呢,学长昨天讲得还是很不错的~
[回复一下]
edsionte 回复:
8月 4th, 2010 at 21:31
谢谢大家的支持与鼓励。往后还需要一起学习讨论。
对了。。直接叫我名字就可以了。。学长,挺不适应的。。。哈哈。。
[回复一下]
不是。。。您没有理解我的意思,我是说,如果在命令:
cp
中, == 时怎么判断?仅仅从命令行参数的字符串判断肯定是不行的,比如源是:
.Test.mmp
而目标是:
./././././././././././././Test.mmp
这样字符串的比较肯定是不等,但是实际还是同个文件(或目录),那么就不能进行拷贝工作,我想了很久,我觉得可能可以从打开前获取其绝对路径(stat貌似做不到,我不知道怎么做),然后就可以比较这两个文件(或目录)的绝对路径是否相同,若不同,则可以复制。
另外一个问题就是我还不是很清楚怎么获知一个文件的权限(需要获知源的权限并依据之决定目标的权限,每一个文件或目录都需要)?而且我实现的时候是在open中直接可以写权限,不是写完之后修改的。
[回复一下]
edsionte 回复:
8月 5th, 2010 at 01:20
1.关于第一个问题,就是源和目的是同一个文件的时,你只要用stat分别获取源和目的的文件属性后,然后比较两者的st_ino这个字段是否相同。我刚修改了代码,是可以检测出来的。
2.还有获取文件属性的问题,首先你用stat获取源文件的属性(buf),然后用chmod函数去设置目的文件,当然你用到的只是buf.st_mode这个字段。完成这个只是设置了存取权限。类似的办法可以设置用户ID,组ID。
[回复一下]
edsionte 回复:
8月 5th, 2010 at 01:26
而且我实现的时候是在open中直接可以写权限,不是写完之后修改的。
—————–
在open中设置的那些权限,比如只读,只写,只是针对你这次打开这个文件的权限。而我们要设置的是权限(即存取权限)是针对U,G,O三个组用户是否可以对这个文件读,写,执行的权限。比如,即便你对某个文件具有读写权限,但是你本次打开这个文件的时候你是以只读方式打开的,你本次就不能对这个文件进行修改。你可以参考我前面的一个文章:http://www.edsionte.com/archives/715
[回复一下]
貌似这个回复中的尖括号会被认为是html语言而消失。。。我上面说的是
在命令
cp [源] [目标]中,[源] == [目标]时怎么判断
[回复一下]
不是的,open最后一个参数是可变参,也就是能够对GUO三个组用户进行权限个改变。
我认为需要修改的权限只是目标的权限,所以直接创建即可,若存在直接更替(单文件拷贝时,cp在无-f开关时是这样做的)。
另外有了新问题,不知道您的cp能不能发现打不开文件是权限问题还是文件不存在问题,也就是说,假如一个文件对于当前用户是不可读的,拷贝自然就无从谈起,那么这个拷贝自然失败,告知用户的应该是“权限不足”之类的提示语句,而不是“文件打开失败”。我今天重新做了测试用例,总结了我的cp的bug,之前我做的cp貌似这个没做好,不知道您的如何~
[回复一下]
edsionte 回复:
8月 5th, 2010 at 03:20
昏。我还以为你说的是open中的打开方式。。
你说的那个新问题,第一条留言中的那位同学也在说这个问题。。(我的my_cp没这个错误提示功能,直接就是在open那出现了权限失败。)我现在对于涉及权限的拷贝问题还在想。比如说拷贝其他组的某个文件,但是你又没有这个权限。。现在还没个定论。。我们都开始做这个功能吧。
[回复一下]