gnu coreutils-4.5.1 seq代码分析

gnu coreutils yes.c代码
看了一段时间的gawk代码,感觉太硬了。于是又读coreutils4.5.1的代码,感觉这些小命令的代码短些,先找找感觉。
先读yes.c,它的代码短些。
yes.c编译不出来,用系统中的yes命令,如yes
打印一串的
y
y
y
在代码中的处理逻辑为:
 while (1)
 {
   int i;
   for (i = 0; i < UNROLL; i++)
     puts ("y");
   if (ferror (stdout))
     break;
 }
如果带了参数的话,如
yes 1 2 3
就打印出
1 2 3
1 2 3
开始不知什么意思,后来,才知道,因为代码的逻辑为:
 while (1)
 {
   int i;
   for (i = 0; i < UNROLL; i++)
     {
       int j;
       for (j = 1; j < argc; j++)
  {
    fputs (argv[j], stdout);
    putchar (j == argc - 1 ? '\n' : ' ');
  }
     }
   if (ferror (stdout))
     break;
 }
其中判断语句有意思,打印到最后一个参数时,就换行。
------------------------------------------------------------------------------------------
whoami.c
再打开看看,其中关键的就是
  uid = geteuid ();
  pw = getpwuid (uid);
  if (pw)
    {
      puts (pw->pw_name);
      exit (EXIT_SUCCESS);
    }
其实,我想把整体弄明白。比如,每个程序开头都有:
  program_name = argv[0];
  setlocale (LC_ALL, "");
  bindtextdomain (PACKAGE, LOCALEDIR);
  textdomain (PACKAGE);
  atexit (close_stdout);
 不知是什么意思?
 不过,有时又感觉这是一些辅助性的代码,不是解决关键问题的,又略过了
 而且whoami.c也编译不了。不知是什么原因。

------------------------------------------------------------------------------------------
读seq.c,因为不知如何seq.c能够编译成功。打印测试语句,编译后,立即能看到效果。这个seq,有几个函数。
usage 打印帮助信息
scan_double_arg (const char *arg)
 把字符串转为数字型
valid_format (const char *fmt)
 检查格式字串的有效性。但我试了写,总写不对。
print_numbers (const char *fmt)
 是干事的程序,主要用于生成一个序列。可以从小到大,也可从大到小。
 
get_width_format ()
 得到字串宽度,
main是主函数,大致流程是:
先根据命令行选项,生成重要全局变量的值,然后调print_numbers,
开始以为程序很长,其实也很好读的。
基本看懂了。






猜你喜欢

转载自blog.csdn.net/woshiyilitongdouzi/article/details/80249526
今日推荐