/* logname -- print user's login name
Copyright (C) 1990-1997, 1999-2005 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
//包含进来4个标准库里的头文件
#include
#include
#include
#include
//包含4个自己包里的头文件,其中system.h位于当前文件夹,其余3个位于lib文件夹
#include "system.h"
#include "error.h"
#include "long-options.h"
#include "quote.h"
/* The official name of this program (e.g., no `g' prefix). */
#define PROGRAM_NAME "logname" //程序名称为: logname
#define AUTHORS "FIXME: unknown" //竟然不知道作者是谁,牛啊,open source
/* The name this program was run with. */
char *program_name; //这里有个疑问,这个全局变量和宏PROGRAM_NAME有什么关系呢
void
usage (int status)//使用方法函数,这个在sync.c True.c里面都有,估计这个软件包应该都是这样设计了一个usage()的标准函数
{
if (status != EXIT_SUCCESS)//如果函数接受到的形参status,其值和宏EXIT_SUCCESS不相等,则
fprintf (stderr, _("Try `%s --help' for more information.\n"),
program_name);//向标准错误打印一串信息
else//如果整型形参status等于宏EXIT_SUCCESS,则打印下面这个代码段的字符串信息
{
printf (_("Usage: %s [OPTION]\n"), program_name);
fputs (_("\
Print the name of the current user.\n\
\n\
"), stdout);
fputs (HELP_OPTION_DESCRIPTION, stdout);
fputs (VERSION_OPTION_DESCRIPTION, stdout);
printf (_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
}
exit (status);//函数的退出状态是接受的形参值,该值在整个函数调用期间一直未被更改
}
int
main (int argc, char **argv)//main主体函数
{
char *cp;//定义字符指针变量cp,作用域只在main函数里
initialize_main (&argc, &argv);//初始化命令行参数,在我的linux平台上,这句话相当于空
program_name = argv[0];//argv[0]是char *类型的变量,将其值赋给全局变量program_name
setlocale (LC_ALL, "");//初始化本地环境
bindtextdomain (PACKAGE, LOCALEDIR);//设置该软件的消息域
textdomain (PACKAGE);//也是设置消息域的
atexit (close_stdout);//yodao词典的翻译是:登记出口函数,这个翻译很到位啊^_^
parse_long_options (argc, argv, PROGRAM_NAME, GNU_PACKAGE, VERSION,
usage, AUTHORS, (char const *) NULL);//解析命令行选项
if (getopt_long (argc, argv, "", NULL, NULL) != -1)
/*
man了一下,返回-1的情况是: -1 for the end of the option list
*/
usage (EXIT_FAILURE);//如果getopt_long没有正常到达应该到达最后一个的情况,就调用usage函数,但是怎么模拟这样的情况,不太清楚
if (optind < argc)
/*
先看看man手册里对optind的解释:
Then optind is the index in argv of the first argv-element
that is not an option.
意思是命令行参数里第一个不是选项的索引(应该是个数目),如果这个值小于命令行参数的个数,则
*/
{//
error (0, 0, _("extra operand %s"), quote (argv[optind]));//调用error函数
usage (EXIT_FAILURE);//调用usage函数,传递的形参是宏EXIT_FAILURE
}
/* POSIX requires using getlogin (or equivalent code). */
cp = getlogin ();
/*
首先man一下这个getlogin,这应该是个系统调用:
getlogin returns a pointer to a string containing the name of the user logged in on the controlling terminal of the pro-
cess, or a null pointer if this information cannot be determined. The string is statically allocated and might be over-
written on subsequent calls to this function or to cuserid.
翻译一下,getlogin返回一个字符串指针,这个字符串包含的内容是当前进程的控制终端上登录的用户名
如果得不到这个值,则返回null,空指针。这个字符串是静态分配内存(也就是放在堆上的静态变量),所以在下次调用或者发生cuserid调用的时候会被覆盖
简单的翻了一下apue的目录,没有发现对getlogin系统调用的说明,ok,就理解这个man就ok了 */
if (cp)//如果cp不是空指针,就是说,getlogin系统调用可以获取到这个字符串
{
puts (cp);//向标准输出打印该字符串
/*
没事看看puts的man吧:
int puts(const char *s);函数声明,接受一个字符指针形参
puts() writes the string s and a trailing newline to stdout.
其作用是向标准输出写这个字符串,并打印一个换行
*/
exit (EXIT_SUCCESS);//main函数顺利退出
}
/* POSIX prohibits using a fallback technique. */
error (0, 0, _("no login name"));//如果代码段执行到这里,就说明有错误发生了
exit (EXIT_FAILURE);//这时候退出状态应该是失败状态
}
------------------------------
使用一下看看效果啦:
[root@bjxdurs235 ~]# logname --help
Usage: logname [OPTION]
Print the name of the current user.
--help display this help and exit
--version output version information and exit
Report bugs to .
[root@bjxdurs235 ~]# logname -h
logname: invalid option -- h
Try `logname --help' for more information.
[root@bjxdurs235 ~]# logname -abc
logname: invalid option -- a
Try `logname --help' for more information.
[root@bjxdurs235 ~]# logname
liufeng
在看这个程序的时候,主要是看了几个man,如getopt_long getlogin,还有puts,呵呵,多看man,相当有好处啊,我现在已经逐渐习惯man手册了,确实很方便,而且讲解权威有透彻,在某种程度上,比google还要好啊
阅读(864) | 评论(0) | 转发(0) |