实现cp命令(5)

2010年8月4日 由 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命令是不能将本目录拷贝到本目录下的。

广告位

15 条评论

  1. 贾威说道:

    武学长你好,我是咱们学校 软件0903班 贾威 今天听了你的讲座受益匪浅,我学会了做事要踏踏实实,一步一步,我有点急躁,但是你的cp好像有这样一个问题,就是权限问题,有的文件普通用户和在同一组的用户cp就不能复制,只有root才有权限复制,这点你好像没有,在你讲座期间我没看到你讲这点,在你讲的期间没好意思提出,不好意思。最后感谢你的讲座,谢谢。还有我想和你一起研究,就是大家都在学习linux c,以后可能还要学习其他知识,我想和你多多讨论。准确来说我想和你定期的讨论一些问题,还有你有啥想做的程序,可以分给我,我也可以在组织几个09届在linux兴趣小组的同学,我们可以一起搞啊,不知你是否愿意,我的gmail 是 harryxiyou@gmail.com 我的邮箱是 harryxiyou@163.com,多多联系。

    [回复一下]

    edsionte 回复:

    给你发163邮箱了。

    [回复一下]

    edsionte 回复:

    给你发163邮箱了。。

    [回复一下]

  2. Woody.c说道:

    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 回复:

    你好,woody同学。至于错误提示, 我是在做主函数的时候,因为我事先对这个命令不熟悉,就会先想会出现那些情况,然后再用cp去试,我也故意输入一些错误命令,然后看他是如何反应的。基本情况就是这样,其实主要还是你去多了解cp命令,然后你就能提高my_cp的健壮行。

    [回复一下]

  3. alenChou说道:

    额,提到刘永平了。。尴尬。。

    [回复一下]

    edsionte 回复:

    这位老师呢,带过我们网页设计和嵌入式。。结果呢,(也许是巧合)我们这两门课大家都等于没学。。不知道你们如何。。

    [回复一下]

  4. Woody.c说道:

    刘永平的嵌入式和Linux两们选修课我上过。。。
    咱们学校很多茶壶煮饺子的老师,肚子里有货倒不出来的情况已经多见少怪了,不过呢,学长昨天讲得还是很不错的~

    [回复一下]

    edsionte 回复:

    谢谢大家的支持与鼓励。往后还需要一起学习讨论。
    对了。。直接叫我名字就可以了。。学长,挺不适应的。。。哈哈。。

    [回复一下]

  5. Woody.c说道:

    不是。。。您没有理解我的意思,我是说,如果在命令:
    cp
    中, == 时怎么判断?仅仅从命令行参数的字符串判断肯定是不行的,比如源是:
    .Test.mmp
    而目标是:
    ./././././././././././././Test.mmp
    这样字符串的比较肯定是不等,但是实际还是同个文件(或目录),那么就不能进行拷贝工作,我想了很久,我觉得可能可以从打开前获取其绝对路径(stat貌似做不到,我不知道怎么做),然后就可以比较这两个文件(或目录)的绝对路径是否相同,若不同,则可以复制。
    另外一个问题就是我还不是很清楚怎么获知一个文件的权限(需要获知源的权限并依据之决定目标的权限,每一个文件或目录都需要)?而且我实现的时候是在open中直接可以写权限,不是写完之后修改的。

    [回复一下]

    edsionte 回复:

    1.关于第一个问题,就是源和目的是同一个文件的时,你只要用stat分别获取源和目的的文件属性后,然后比较两者的st_ino这个字段是否相同。我刚修改了代码,是可以检测出来的。
    2.还有获取文件属性的问题,首先你用stat获取源文件的属性(buf),然后用chmod函数去设置目的文件,当然你用到的只是buf.st_mode这个字段。完成这个只是设置了存取权限。类似的办法可以设置用户ID,组ID。

    [回复一下]

    edsionte 回复:

    而且我实现的时候是在open中直接可以写权限,不是写完之后修改的。
    —————–

    在open中设置的那些权限,比如只读,只写,只是针对你这次打开这个文件的权限。而我们要设置的是权限(即存取权限)是针对U,G,O三个组用户是否可以对这个文件读,写,执行的权限。比如,即便你对某个文件具有读写权限,但是你本次打开这个文件的时候你是以只读方式打开的,你本次就不能对这个文件进行修改。你可以参考我前面的一个文章:http://www.edsionte.com/archives/715

    [回复一下]

  6. Woody.c说道:

    貌似这个回复中的尖括号会被认为是html语言而消失。。。我上面说的是
    在命令
    cp [源] [目标]中,[源] == [目标]时怎么判断

    [回复一下]

  7. Woody.c说道:

    不是的,open最后一个参数是可变参,也就是能够对GUO三个组用户进行权限个改变。
    我认为需要修改的权限只是目标的权限,所以直接创建即可,若存在直接更替(单文件拷贝时,cp在无-f开关时是这样做的)。
    另外有了新问题,不知道您的cp能不能发现打不开文件是权限问题还是文件不存在问题,也就是说,假如一个文件对于当前用户是不可读的,拷贝自然就无从谈起,那么这个拷贝自然失败,告知用户的应该是“权限不足”之类的提示语句,而不是“文件打开失败”。我今天重新做了测试用例,总结了我的cp的bug,之前我做的cp貌似这个没做好,不知道您的如何~

    [回复一下]

    edsionte 回复:

    昏。我还以为你说的是open中的打开方式。。
    你说的那个新问题,第一条留言中的那位同学也在说这个问题。。(我的my_cp没这个错误提示功能,直接就是在open那出现了权限失败。)我现在对于涉及权限的拷贝问题还在想。比如说拷贝其他组的某个文件,但是你又没有这个权限。。现在还没个定论。。我们都开始做这个功能吧。

    [回复一下]

发表回复

windows 7 ultimate product key

windows 7 ultimate product key

winrar download free

winrar download free

winzip registration code

winzip registration code

winzip free download

winzip free download

winzip activation code

winzip activation code

windows 7 key generator

windows 7 key generator

winzip freeware

winzip freeware

winzip free download full version

winzip free download full version

free winrar download

free winrar download

free winrar

free winrar

windows 7 crack

windows 7 crack

windows xp product key

windows xp product key

windows 7 activation crack

windows7 activation crack

free winzip

free winzip

winrar free download

winrar free download

winrar free

winrar free

download winrar free

download winrar free

windows 7 product key

windows 7 product key