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;
}
其中判断语句有意思,打印到最后一个参数时,就换行。
看了一段时间的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);
}
再打开看看,其中关键的就是
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);
program_name = argv[0];
setlocale (LC_ALL, "");
bindtextdomain (PACKAGE, LOCALEDIR);
textdomain (PACKAGE);
atexit (close_stdout);
不知是什么意思?
不过,有时又感觉这是一些辅助性的代码,不是解决关键问题的,又略过了
而且whoami.c也编译不了。不知是什么原因。
不过,有时又感觉这是一些辅助性的代码,不是解决关键问题的,又略过了
而且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,
开始以为程序很长,其实也很好读的。
基本看懂了。