main(int argc,char* argv[]) 实用 demo


记得刚开始学习 c++ 的时候总是用最简单的开头函数,以至于自己都形成了一种沉溺于这种简单的心态如:

int main(){

}

main() 不传入任何参数,而平常的课堂练习或者作业也多是看到这样简单的开头,
后来看到别的代码却发现,这些代码总是用这样的开头函数:

int  main(int argc,char *argv[]){

}

那时候一点都不知道为什么总是会多写这两个参数,像上面的简简单单的开头函数不好么?总感觉那两个参数特别烦甚至觉得是多余的,后来渐渐的发现但不是很实战的去
理解,argc 表示参数的个数,其中程序的名字也算一个参数,而 argv 则表示这些参数的的具体内容,比如 argv[0] 是指程序的名称。对于这两个参数的了解也就那么多而已。直到今天下午(2 月 7 日)小灏子问了我一个问题… 现在理清了一下,问题是:在当前目录下做一个 soft link(名字为 id) 到 busybox,执行当前目录的 id 与执行 busybox id 的效果是一样的,这是怎么做到的?
后来查看了具有与 busybox 类似情况的 xtables-multi 源代码,发现其实问题的答案就与这两个参数有关,原来 xtables-multi 的一开始就把传入程序的参数从第一个开始处理后 (basename()) 与预先保留的字符作比,如果发现这些参数不留有项中,则提示“No subcommand given”等提示;否则就执行相应的 sub_main()。自己写了个小 demo,如图:



需要注意的是,当执行软链接的 app 时,程序的第一个参数就是软链接的名称而不是源程序的名称。
这下子,自己对 (int argc,char *argv[]) 的作用多了点实战的认识。

#include <iostream>
#include <cstdio>
#include <libgen.h>  //basename
using namespace std;
int main(int argc, char *argv[])
{
	// char *c[]={"/jfe/ajfje","two/jfej/demo"};
	// char **cc=c;
	// ++cc;
	// char *cp=(*cc);
	// const char *cmd = basename((cp));
	printf("app's name %s\n",basename(*argv));

	return 0;
}

2015-02-12