linux程序如何获得参数

/*
getopt的用法和用途类似与在shell脚本当中使用的getopts命令一样,现在讨论在系统调用情况下的使用
包含头文件:#include
原型:
 int getopt (int _argc ,char *const *_argv, const char * _shortopts)
 int getopt_long(int _argc,char *const *_argv,const char *shortopts,const struct option *_longopts,int *_longind);

参数解释:
_argc :即main当中的argc
_argv :即main当中的argv
_shortopts:选项字符串,该参数指定了解析命令行参数的规则。getopt认可的命令行选项参数是通过"-"进行的,例如,ls -l的“-l”。该参数中,如果某个选项有输入数据,则在该选项字符的后面应该包括":",如ls -l ./a,在指定本参数时,应该用“l:”。对于该选项,有一点需要注意,如果该参数的第一个字符串是“:”,则getopt发现无效参数后并不返回失败,而是返回“?”或则“:",表示无效参数,则返回":",
getopt只能支持单字符的选项,如-l,-a等,如果需要支持多字符串的选项,如-file等,就需要用到getopt_long通过指定一个struct option 类型的结构数组,将多字符的选项映射为单个字符,从而实现了对个字符选项的支持。struct option的结构如下:
struct option
{
	const char * name;//定义了多字符的选项名称
	int has_arg;//定义了是否有选项值,如果该值为0,则表示没有选项值,如果该值为1,表示该选项有选项值,如果该值为2,表示该选项的值是可有可无的
	int *flag;//如果该成员定义为NULL,则点用getopt_long的返回之为该结构val字段的值,如果该成员不为NULL,getopt_long调用后,将在该参数所指向的  变量中添加val值,并且getopt_long返回0,通常该成员定义为NULL即可

	int val;//长选项对应的短选项名称
};


_longind:输出参数,如果该参数没有设置为NULL,那么它是一个指向整型变量的指针,在getopt_long运行时,该整型变量会被赋为获取到的选项在结构数组当中的索引值

返回值说明:
"?":表明getopt返回一个未在_shortopts定义的选项
“:”:表明该选项需要选项值,而实际为输入选项值
-1:表明getopt解析完毕,后面已经没有选项。
0:在getopt_long的结构数组参数_longopts中的成员flag定义了值,此时,getopt_long返回0,而选项的参数将储存在flag所指向的变量中
其他:回返的选项字符

在使用getopt是,需要注意与该系统调用相关的全局变量的使用,详细说明如下。
optind:整型变量,存放环境变量属猪argv的当前索引值,当调用getopt循环取选项结束(getopt返回-1),剩余的参数在argv[optind]~argv[argc-1]中
optarg:字符串指针,当处理一个带有选项的参数时,全局变量optarg将存放该选项的值。
optopt:整型变量,当点用getopt发现无效的选项(getopt返回“?”或“:”)时,此时optopt包含了当前无效的选项。
opterr:整型变量,如果调用getopt前设置该变量为0,则getopt在发现错误时不输出任何信息。

*/



#include
#include

int save_flag_arg;
char *opt_arg_value;
struct option longopts[]={
	{"flag",no_argument,&save_flag_arg,'f'},
	{"name",required_argument,NULL,'n'},
	{NULL,0,NULL,0},
};

int main(int argc,char *argv[])
{
	int i,c;
	while((c=getopt_long(argc,argv,":n:f",longopts,NULL)) != -1)
	{
		switch(c)
		{
			case 'n':
				opt_arg_value =optarg;
				printf("name is %s.\n",opt_arg_value);
				break;
			case 0 :
				if (save_flag_arg =='f')
				{
					printf("flag argument found!\n");
				}
				break;
			case ':':
				printf("argument %c need value.\n",optopt);
				break;
			case '?':
				printf("Invalid argument %c!\n",optopt);
				break;
		}
	}
	
	return 0;

}

/*

我直接的终端运行是如下:
1-------------------------------------------
jiangjian@jiangjian-K42JZ:~/cprogram/process$ ./getopt --name jiangjian  //注意如果是多字符的话前面得写"--",单字符都可
name is jiangjian.
jiangjian@jiangjian-K42JZ:~/cprogram/process$ 


2  
jiangjian@jiangjian-K42JZ:~/cprogram/process$ ./getopt -n jiangjian
name is jiangjian.
jiangjian@jiangjian-K42JZ:~/cprogram/process$ 

*/

你可能感兴趣的:(C语言)