linux命令free源码解读
linux命令free源码解读:Procps free.c
作者:isayme 发布时间:September 26, 2011 分类:Linux
我们讨论的是linux命令free的实现。
free命令是随软件包procps一同发布的。完整的代码下载链接:下载procps
首先找到free命令的实现文件free.c,直接看main函数部分:
while( (i = getopt(argc, argv, "bkmglotc:s:V") ) != -1 )
switch (i) {
case 'b': shift = 0; break;
case 'k': shift = 10; break;
case 'm': shift = 20; break;
case 'g': shift = 30; break;
case 'l': show_high = 1; break;
case 'o': old_fmt = 1; break;
case 't': show_total = 1; break;
case 's': pause_length = 1000000 * atof(optarg); break;
case 'c': count = strtoul(optarg, NULL, 10); break;
case 'V': display_version(); exit(0);
default:
fwrite(help_message,1,strlen(help_message),stderr);
return 1;
}
很明显,这是检查命令输入参数的。如判断是free -k还是free -m等,很简单的代码。显然这不是本文的重点。
继续看紧接着的代码:
do {
meminfo();
printf(" total used free shared buffers cached\n"); printf(
"%-7s %10Lu %10Lu %10Lu %10Lu %10Lu %10Lu\n", "Mem:",
S(kb_main_total),
S(kb_main_used),
S(kb_main_free),
S(kb_main_shared),
S(kb_main_buffers),
S(kb_main_cached)
);
}
代码不是完整的整块,后面的内容都是根据上段代码获取的参数有选择的输出相应的信息。我们假设调用free命令的时候未添加任何参数,那么后面的代码都不是那么重要了。
代码中,先是调用meminfo()函数,然后直接printf。简洁,明了。很明显meminfo函数中对printf函数中读取的变量进行了初始化。所以,我们的任务是meminfo()。首先是查看meminfo代码: