coreutils4.5.1源码阅读读后感20200905
先把源码的长度进行排序,
wc -l *.c | sort -n > source.txt
并写到一个文件中,如图:
2 ls-dir.c
2 ls-ls.c
2 ls-vdir.c
7 md5.c
7 sha1sum.c
71 false.c
71 true.c
74 sync.c
82 pwd.c
读代码时,打开这个文件,从长度最小的依次向下读。当读不下去时,就又从头开始读。个人感觉coreutils4.5的源码还是适合入门的。因为基本上一个程序就对应一个源码。可以进行修改。当堂可以看到效果。我比较喜欢数学类操作,对文件类操作不太熟悉,但感觉作者对文件操作非常熟悉。举个例子。
./yes
输出是:
y
y
y
.....
其程序逻辑如下:
处理输出的逻辑是:
while (1)
{
int i;
for (i = 0; i < UNROLL; i++)
puts ("y");
if (ferror (stdout))
break;
}
当时我就想,为什么不直接写一个循环呢?为什么要弄两个循环呢?后来想,也许作者是怕输出缓冲区溢出吧。
像comm.c中,作者读入一行,是用到了如下结构:
/* thisline[i] points to the linebuffer holding the next available line
in file i, or is NULL if there are no lines left in that file. */
struct linebuffer *thisline[2];
/* streams[i] holds the input stream for file i. */
FILE *streams[2];
因此,真是能学到不少的知识。
我读代码是瞎看的。因为我总想知道核心的处理逻辑,知道了核心的处理,我就不迷信了,知道了程序不是魔法了。而是用我也知道的朴素逻辑弄出来的。因此,我读代码很快,如果我找不到核心逻辑,也许我就会放弃这个程序,再找下一个程序来读。就好像记单词一样,每次都记大量的单词。通过大量重复来增强记忆。
今天又从头看到了fold.c。也许要休息一下了。