
gnu
woshiyilitongdouzi
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
谈谈我读源码的心得
谈谈我读源码的心得为了搜索他人对gnugawk源码的分析成果,在百度上搜索,发现除了我写的一些东西,其它人没有写。于是,就重新操起了笔,自己接着写。我很久没上csdn,密码忘记了,上次登陆没进去。这次居然一次性还记起来了。首先,我想,还是读老版本的代码,性价比高。因为老版本的代码,解决了最核心的问题,从0到1,这是最根本的。但一个问题,老版本的代码编译不了,因为操作系统,编译器都不同了。于是...原创 2020-03-08 11:31:25 · 294 阅读 · 0 评论 -
gawk1.01源码分析——进行调试2
gawk1.01源码分析——进行调试2今天读代码时,发现我对awk2.c中如何生成解析树的过程还是很模糊。于是想上网搜索资料。发现没有。于是,心想,没人写,那我就再接着写吧。不指望有多少人看,就当成是把自己分析源码的心得、想法进行总结。就当写日记一样。以前读源码,因为编译不了,总是纸上谈兵,但读着读着,发现不行。因为我无法验证我的理解对不对?而且也没有人和我交流,那不行。还是要把程序编译成功...原创 2020-03-08 10:50:02 · 191 阅读 · 0 评论 -
gawk1.01源码分析——进行调试
gawk1.01源码分析——进行调试因为疫情之故,天天在家。前段天天读小说,后来,觉得,还是读源码,至少让精力有地方发泄。于是,又重新读源码。虽然很久没读,但发现,以前读过,现在再读,还是有种熟悉的感觉。但,发现光读代码,而代码跑不起来,没有感觉。还是要把代码编译,测试,再修改,再编译,执行后看修改是否产生的效果。因此,又捡起原来曾编译通过的代码。再开始。./gawk --version...原创 2020-03-08 10:27:35 · 130 阅读 · 0 评论 -
gawk awk3.c源码分析
gawk awk3.c源码分析本来昨天要完成的,昨天晚上睡得太早,就忘记了,今天打开电脑,第一件事,就是把这篇完成。这个文件主要完成一些内部函数的定义。先定义了一些外部变量,就于对应awk程序中的NF,FS,RS,NR,FILENAME,OFS,ORS,OFMT之类。inin_vars() 这个函数主要用于完成对NF,FS,RS,NR,FILENAME,OFS,ORS,OFMT变量的...原创 2019-12-22 08:59:54 · 222 阅读 · 0 评论 -
gawk awk1.c源码分析
gawk awk1.c源码分析今天接着读代码。前段时间迷上读网络小说,用kindle看小说,看得天昏地暗。读小说锻炼了阅读速度。星期五购买了几件打折的衣服。我要好好读代码,把购衣服的价值创造出来。言归正传。我用一台旧的笔记本不上网,只用于在上面写代码。因为上面只有gawk的源码,没有拷coreutils的源码,所以就读gawk的了。今天看的时候,感觉把这篇基本全部看懂了。个别细节也懂了。下...原创 2019-12-21 19:23:08 · 308 阅读 · 0 评论 -
gnu coreutils4.5.1 源码分析感想:luck read the source
今天想写一段关于读源码的感想。首先源码并不是难于上青天,只要努力,我也能看懂。当然路上会遇到很多困难。比如英语看不懂,比如基础差。这都不是问题,关键是你要迈出这第一步。其它的问题都让它在过程中解决,比如英语不懂,没问题,下载必应词典,复制整段英语后翻译,比如基础差,对相关库不理解,不要紧,看多了,就知道怎么一回事。没吃过猪肉,总看到过猪走路。同时,在看的过程中,再看看C语言课本。就这么一回事,先混...原创 2018-03-07 09:53:18 · 223 阅读 · 0 评论 -
gnu coreutils utime.c 源码分析
该函数显示系统时间。先看main根据参数个数,调用uptime函数。 switch (argc - optind) { case 0: /* uptime */ uptime (UTMP_FILE); break; case 1: /* uptime <utmp file> */ uptime (argv[optind]); ...原创 2018-03-07 11:23:12 · 228 阅读 · 0 评论 -
gnu coreutils chgrp.c 源码分析
这个函数用于改变用户名、用户组之类。用户管理这块不太熟悉,所以要多做试验,创建几个用户来试验一下。先看main.c为存储选项值,用了一个结构体 struct Chown_option chopt;先初始化结构体 chopt_init (&chopt);再分析选项,找出结构体的值 while ((optc = getopt_long (argc, argv, "Rcfhv", long_op...原创 2018-03-07 11:24:35 · 169 阅读 · 0 评论 -
gnu coreutils rm.c 源码分析
先看main.c,同样,先定义一个struct rm_options,用于存储命令选项,先初始化 rm_option_init (&x);接着,分析选项,向结构体赋值。 while ((c = getopt_long (argc, argv, "dfirvR", long_opts, NULL)) != -1) { switch (c) { case 0: /* Lon...原创 2018-03-07 11:44:01 · 293 阅读 · 0 评论 -
gnu coreutils echo.c 源码分析
打开echo.c,发现代码写得好长呀。在我的心目中,处理选项,然后就直接输出呀。只要这一段就够了 { while (argc > 0) { fputs (argv[0], stdout); argc--; argv++; if (argc > 0) putchar (' '); } }为什么这么长呢?echo -n ...原创 2018-03-07 11:52:40 · 204 阅读 · 0 评论 -
gnu coreutils源码 cat.c分析
今天开始写博客。尝试着分析源码。不写那么多废话,全写自己对源码的理解。读了cat.c,网上找到了一个好文章:http://blog.youkuaiyun.com/mingdaotang/article/details/50446350可惜,关键地方还是没看懂。引用作者的一段:字符映射要实现这个功能,就无法再简单的整页读写数据,中间需要再加一个处理的步骤:按整页读出数据。逐个字符的遍历输入缓冲区(inbuf),...原创 2018-03-01 21:18:05 · 339 阅读 · 0 评论 -
gnu coreutils源码 pwd.c分析
想看SED的源码,把GETOPT.C看完了,硬是看不懂,后来,按作者的调试程序,进行编译,再慢慢调,看把GETOPT.C看完,但正则表达式的那段又看不懂,看了一个1000行左右的正则表达式,还是代码数量少的容易看懂。于是打开PWD.C,这个代码真容易看。前面是USAGE,我忽略掉。MAIN主程序中,就一句重要的话XGETCWD(),这个程序很容易懂。可惜我想单独编译这个程序,编译不出来,如果能单独...原创 2018-03-01 21:24:40 · 342 阅读 · 0 评论 -
gnu coreutils源码 HEAD.c分析
HEAD.C这个文件也基本看完了,感觉写得很好,看代码,我以为要象看小说一样,先把大的情节搞明白,在大方向正确的前提下,再细看每一行代码。或者更像陶渊明,好读书,不求甚解,在初期,你搞得太细,就没办法进行下去了,把自己弄得累,也体会不到乐趣,我的办法是,先大致看看,明白大框架后,留下一些问题,等时机一成熟,就慢慢理解了。现在说说对HEAD.C的理解。先说MAIN.C如果有选项 HEAD -9 MM...原创 2018-03-01 22:14:31 · 192 阅读 · 0 评论 -
gnu coreutil源码分析nl.c
昨天写了四篇博文,我想先求量的增加,再慢慢打磨。不要一下生出天才儿童,慢慢有孩子出生,总有成才的机会。读程序也一样,我想,我先求量,先大量读,半生半熟的大量消化代码,再慢慢的回味。反正,读开源的代码,纯是为了自己,自己的地盘自己做主。这几天开始读nl.c,这段代码也不太好读。先梳理大概。从main开始。如果有多个文件需要打印出来,如nl a1.c a2.c a3.c有三个文件需要打印,此时,在ma...原创 2018-03-02 07:56:08 · 352 阅读 · 0 评论 -
gnu coreutils 代码编译
今天接着看代码。总感觉代码不能调,没有感觉,真是隔着靴子捞痒,所以还是准备到另一台电脑上把coreutils的源码编译一次,心里想的是,真把那些shell命令弄坏了,大不了重新装linux,于是就开始折腾。开始编译4.5.1版本,我呢,不折腾了,单独编译一个程序,太麻烦,我还是全部编译,先下载文件,再tar -zxvf .gz文件进入文件夹,执行sudo ./configuresudo make ...原创 2018-03-03 20:55:35 · 858 阅读 · 0 评论 -
gnu coreutils越早版本的代码越好读
读代码,我想还是读最早版本的代码较划算一些。读新版本的代码,量太大,收益不高。读老版本的代码,当时实现的都是一些最重要的功能,而且没有那么多与平台相关的代码,看的是干货。但即令如此,还是让人有些晕,这几天看sort.c,cp.c代码多得让人想吐。我明明知道,sort.c肯定用了排序算法,但我居然找不到在哪里排序,用的什么算法。而comm.c我看了几次,心想,肯定有一处比较两项是否相等,可就是找不到...原创 2018-03-03 21:04:41 · 517 阅读 · 1 评论 -
gnu corenutils comm.c源码分析
今天分析comm.c这个文件很有意思,如果b1内容如下:123如果b2内容如下135那comm b1 b2结果分三列第一列为B1独有的,第二列为B2独有,第三列为B1,B2共有的。程序要求两个文件都排好顺序,但作者是如何实现这个功能的呢?从MAIN.C开始,开头是处理选项,把选项的结果用三个变量保存调子程序compare_files来进行具体比较。compare_files可相当奇怪。先打开要比较...原创 2018-03-03 22:02:18 · 159 阅读 · 0 评论 -
gnu corenutils comm.c源码分析2
刚才又看了下,原来两个字串是用xmemcoll来比较大小。我原来以为是内容函数呢,跳进去一看,原来又用了memcoll,而memcoll又调用了strcoll网上百度一下,原来strcoll和strcmp差不多。真是怪。linux下,用ctags,再用vim读代码,真是爽呀。只要sudo apt-get install ctags再回到项目文件,生成tagsctags -R *不过,要在vim中执...原创 2018-03-03 22:23:09 · 149 阅读 · 0 评论 -
gnu coreutils4.5.1 uname.c源码解读
找第二代码量少的程序是chown.c,但还有.h文件,所以单独看程序,也是不对的。但我就只看chown.c吧。这个命令都不熟悉,baidu下,找个用例,然后就修改源码。加打印语句。 for (; optind < argc; ++optind) errors |= change_file_owner (1, argv[optind], uid, gid, old_uid, o...原创 2018-03-04 05:52:10 · 289 阅读 · 0 评论 -
gnu coreutils4.5.1 uname.c源码解读
捍卫自己的梦想今天早上醒来很早,昨天做了一个梦,大意是,我买到两双旧皮鞋,花了70元,然后有人看到用40双新皮鞋来换我的上鞋子。因为这两双旧鞋是这个人年轻的丢掉自己梦想的遗留物。那人曾追求旧皮鞋卖主的母亲,关键时刻那人,为了事业,就放弃了这个人。现在回首往事,就想买回皮鞋。我想,自己的梦想是什么?如果自己的梦想用40双皮鞋也能买到,那是否太便宜,我的梦想,如此便宜,那我本人是否也就便宜了?于是,我...原创 2018-03-04 05:52:56 · 528 阅读 · 0 评论 -
gnu coreutils4.5.1 fold.c源码解读
今天下午读fold的源码,选项较少,我先对命令的用法进行学习。创建一个文件,b3,内容如下:12345 6689901234 567777777然后测试。fold -s -b8 b3fold -b8 b3fold -b -w3 b3先学会命令,知道业务后,再看代码。先分析main.c,getopt得到其选项,分析选项后,对特殊变量进行设置,以记住选项。count_bytes记住按字节...原创 2018-03-04 16:05:49 · 152 阅读 · 0 评论 -
gnu coreutils4.5.1 true.c源码解读
这个命令的代码真短。核心意思是 exit (EXIT_SUCCESS);在shell中进行尝试trueecho $?返回0这个命令主要用在脚本中,今天统计了一下,coreutils4.5.1的全部源码数量cat ./lib/*.c ./lib/*.h ./src/*.c ./src.*.h | wc -l总共不超过10万行,如果只算src目标下的,只有5万多行。我先尽量的看,往前赶,天下武功,唯快...原创 2018-03-04 16:13:08 · 155 阅读 · 0 评论 -
gnu coreutils4.5.1 false.c源码解读
这个命令的代码真短。核心意思是 exit (EXIT_FAILURE);在shell中进行尝试falseecho $?返回1原创 2018-03-04 16:16:04 · 131 阅读 · 0 评论 -
gnu coreutils4.5.1 sync.c源码解读
这个命令的代码真短。核心意思是 sync ();在shell中进行尝试syncecho $?返回0这个程序主要是把缓冲区数据写到硬盘,短代码看完了,很有成就感。原创 2018-03-04 16:19:30 · 194 阅读 · 0 评论 -
gnu coreutils4.5.1 hostid.c源码解读
这个命令的代码真短。核心意思是id = gethostid ();原创 2018-03-04 16:22:42 · 175 阅读 · 0 评论 -
gnu coreutils4.5.1 logname.c源码解读
这个命令的代码真短。核心意思是 cp = getlogin ();尽管短,也写一文章吧,互联网上有如经济学,劣币驱逐良币,先求量,写多了,质量就上去了。原创 2018-03-04 16:26:25 · 164 阅读 · 0 评论 -
gnu coreutils4.5.1 whoami.c源码解读
这个命令的代码真短。核心意思是 uid = geteuid (); pw = getpwuid (uid);看来,代码都有一定的模式,对选项的处理,每个程序都有一个usage等。原创 2018-03-04 16:29:21 · 196 阅读 · 0 评论 -
gnu coreutils4.5.1 link.c源码解读
这个命令的代码真短。核心意思是link (argv[1], argv[2]4.5.1还不能处理软连接,于是我在本地进行编译,加上打印helloworld1,表示是修改的版本。再sudo make && make install./link b3 b4可以执行,但若加参数,就报错。看来,罗马不是一天建设成的,功能也是慢慢加上去的。很好...原创 2018-03-04 16:35:36 · 149 阅读 · 0 评论 -
gnu coreutils4.5.1 yes.c源码解读
这个命令的代码真短。核心意思是 while (1) { int i; for (i = 0; i < UNROLL; i++) puts ("y"); if (ferror (stdout)) break; }为看到效果,于是我在本地进行编译,,并把循环次数改成100,加上打印helloworld1,表示是修改的版本。再sudo make &&a...原创 2018-03-04 16:48:04 · 299 阅读 · 0 评论 -
gnu coreutils4.5.1 unlink.c源码解读
这个命令的代码真短。核心意思是 if (unlink (argv[1]) != 0) error (EXIT_FAILURE, errno, _("cannot unlink %s"), quote (argv[1]));其中对--的处理,让我很是纠结,没看懂 if (1 < argc && STREQ (argv[1], "--")) { --argc...原创 2018-03-04 16:51:30 · 180 阅读 · 0 评论 -
gnu coreutils4.5.1 dirname.c源码解读
这个命令的代码真短。核心意思是 result = argv[1]; len = dir_len (result); if (! len) { result = &dot; len = 1; } fwrite (result, 1, len, stdout); putchar ('\n');我在本地试验了一下,如果dirname /home/mm显示为...原创 2018-03-04 17:03:20 · 232 阅读 · 0 评论 -
gnu coreutils4.5.1 chroot .c源码解读
今天有些疲劳了。这个chroot是干什么用的,本身不了解。但从源码来看,倒不复杂,无非是(chroot (argv[1]) execvp (argv[0], argv);这两个系统调用。但问题是,这两个系统调用不懂它的意思。还是放过吧。...原创 2018-03-04 17:15:55 · 287 阅读 · 0 评论 -
gnu coreutils tty.c源码分析
今天把昨天没看完的一个大小3K的文件看完。tty.c很简单,我很喜欢。只有一个选项-s,设置一个静态变量,silent=0,如果加选项-s,使silent=1后面打印时 if (!silent) { if (tty) puts (tty); else puts (_("not a tty")); }整个程序,就一句有用的 tty = ttyname (0);这个...原创 2018-03-05 16:08:57 · 184 阅读 · 0 评论 -
gnu coreutils hostname.c源码分析
这是第一个4K大小的程序。其中有一段宏#ifdef HAVE_SETHOSTNAME if (argc == 2) { int err; /* Set hostname to argv[1]. */ err = sethostname (argv[1], strlen (argv[1])); if (err != 0) error (E...原创 2018-03-05 16:10:10 · 241 阅读 · 0 评论 -
gnu coreutils printenv.c源码分析
printenv.c很有意思的。代码同样简短,但有一个地方很怪,只是定义了一个外部变量,不是定义,只是声明。extern char **environ;后面就可以以打印全部环境变量 for (env = environ; *env != NULL; ++env) puts (*env);真是奇怪了。我找了environ,好象也只是一个宏,这个以后再细究。开始我也不明白,这个命令究竟是做什么...原创 2018-03-05 16:11:25 · 214 阅读 · 0 评论 -
gnu coreutils basename.c源码分析
接着看。这个程序呢,main前面,判断参数个数,argc刚好2个或3个时,程序不报错,否则报错,两个例如:basename /home/mm三个例如basename /home/mm/nnok nnmain中最重要的一句是name = base_name (argv[1]);其中若有第三个参数,处理如下: if (argc == 3) remove_suffix (name, argv[...原创 2018-03-05 17:51:54 · 217 阅读 · 0 评论 -
gnu coreutils users.c源码分析
我看程序的步骤是先读说明文档,《Linux中文man在线手册(Linux公社整理www.linuxidc.com)》,先学习这个命令如何使用。接着在本地进行编译,确保能使用这个命令,因为目前系统中对应命令都太高了。再从main开始读,遇到感兴趣的就细读,但一定要快速的看完,不求全部看懂,那太累,遇到不懂的,先提问题。遇到代码中的注释,把整段英语拷到必应词典中进行翻译。这个命令在文档中找不到,编译也...原创 2018-03-05 18:23:46 · 335 阅读 · 0 评论 -
gnu coreutils mkfifo.c源码分析
创建命名管道。只带一个选项参数,主要是调用了系统调用 int fail = mkfifo (argv[optind], newmode);其它也就没什么了。若传入了-m选项,就再chmod (argv[optind], newmode);真没有什么可说的。...原创 2018-03-06 09:55:28 · 257 阅读 · 0 评论 -
gnu coreutils nice.c源码分析
这个命令不会用。读操作系统设计时,对调整优先级的这段一直没弄懂。读源码时,发现主要调用了nice (adjustment) == -1 execvp (argv[i], &argv[i]);大致是先设置进程优先级,再执行进程。实在没大多可讲的。先混个脸熟吧。...原创 2018-03-06 09:56:06 · 209 阅读 · 0 评论 -
gnu coreutils mkdir.c源码分析
mkdir有-p选项,表示父目录不存在,就顺便也创建。-m选项,用于目录权限相关设置前面的一扫而过,像usage函数,功能都一样。重点在main.c中, while ((optc = getopt_long (argc, argv, "pm:v", longopts, NULL)) != -1)这段用于分析选项,并根据选项对某些变量进行设置再一个大的for循环,对每个需要建立的目录分别建立如下: ...原创 2018-03-06 09:56:55 · 461 阅读 · 0 评论