gnu coreutils-4.5.1 echo.c代码分析

gnu coreutils-4.5.1 echo.c代码分析
早上起床,开始读代码。
挑了个echo.c来看。这个命令很简单,太作者写得太长了,有一个V9——DEFAULT的处理,真长。我想,这段需要执行吗,于是加个打印语句,确定这段代码没有执行。
真正有用的代码,就是
while(argc>0)
{
 fputs(argv[0],stdout);
 argc--;
 argv++;
}
我想,那命令的名字是否也会显示出来呢?
我以为不会,因为在前面已经对
argc--
argv++
这个程序处理选项时,没有调用getopt函数,而是自己写了一套处理流程。很长,我也懒得细看了。看来,写这些代码的,也不是同一个人,每人都有自己的套路。
gnu coreutils-4.5.1 sum.c代码分析
看到sum.c,我以为是计算什么的和呢?打开一看,好象不是。
ls sum*
看,是否有sum这个命令,一看真有。我不知这个命令做什么用。但读代码,好象是对一个文件的所有字符加起来,再哈希一把,返回一个整数。干什么?类似于是判断两个文件是否相同的套路了。
读程序,有两个函数来计算:
bsd_sum_file
sysv_sum_file
作者用到了一个指向函数的指针sum_func
根据选项来设置它,-r用bsd_sum_file,-s用sysv_sum_file,程序大致流程是,设后面传进来的是文件,把每个文件都计算一次。我刚测试了一下,如果传进去多个文件,是每个文件都计算出哈希值。

./sum 2.text 1.text
就显示两行。
bsd_sum_file这个函数的流程也不难,打开文件,读每个字符,把读的字符累加到
checksum += ch;
checksum &= 0xffff
以后再细究吧。

gnu coreutils-4.5.1 comm.c代码分析
看看comm.c,我以前还曾想在excel中比较两个文件,找出两个文件公共的内容以及各自特殊的内容,后来才晓得原本有comm这个命令。
伍昊说,没事要经常翻翻帮助文件,看来还真是这样,没事就翻翻函数,至少要晓得什么事是系统曾提供了的,至于具体干法可以留到下一步再做。
代码编译了,读起来,就爽多了,就象自己写的代码一样了,修改、编译、执行,真爽。
因为先是要把两个文件排好序,再进行逐一比较,类似于两个数组的比较,主要处理就在函数compare_files中。
先打开两个文件
再每个文件各读一行
循环处理(只要各个行不全是空)
 如果第一文件读完了,设置order=-1
 如果第二文件读完了,设置order=1
 否则,比较这两行,设置order的值
 根据order的值,读第一文件或第二文件。
关键是根据order的值读文件,我开始想,不应该每个文件都各读一行吧,后来一想,因为涉及到比较大小 ,所以要看谁大,大的那方要先等下,先读小的一方,如此而已。
我看到自己加了print语句,导致打印格式乱了,于是重新去掉调试语句,再编译就正常了,看来,读代码功力有提升。哈哈

猜你喜欢

转载自blog.csdn.net/woshiyilitongdouzi/article/details/80288241