分类: C/C++
2010-01-27 11:23:35
用C语言实现命令功能机制与参数传递. ---源于brctl源码.
命令格式: brctl showbr br0 XX .......
↑ ↑ ↑ ↑ ↑
Argv[0] Argv[1] Argv[2] Argv[3] Argv[N]
此命令的作用即是列出br0的网卡信息.
在brctl.c中 mainc()是这样定义的:
int main(int argc, char *argv[])
{
int argindex;
struct bridge *br;
struct command *cmd;
if (argc < 2) //首先判断参数的个数是否正确.否则goto到常用的help栏.
goto help;
if ((cmd = br_command_lookup(argv[1])) == NULL) {
fprintf(stderr, "never heard of command [%s]\n", argv[1]);
goto help;
}
//br_command_lookup()判断showbr是否存在.在br_command_lookup()中调用了结构
//struct command commands[]; 在此结构中包含了所有的与showbr类似的命令.
//struct command *br_command_lookup(char *cmd)
//{
// int i;
// int numcommands;
// numcommands = sizeof(commands)/sizeof(commands[0]);
// for (i=0;i
// if (!strcmp(cmd, commands[i].name))
// return &commands[i];
// return NULL;
//}
argindex = 2;
br = NULL;
if (cmd->needs_bridge_argument) { //根据argv[1],再判断argv[2],argv[3]...的合法性.
if (argindex >= argc) {
fprintf(stderr, "this option requires a bridge name as argument\n");
return 1;
}
br = br_find_bridge(argv[argindex]);//argv[2];
if (br == NULL) {
fprintf(stderr, "bridge %s doesn't exist!\n", argv[argindex]);
return 1;
}
argindex++;
}
cmd->func(br, argv[argindex], argv[argindex+1]);
//cmd->func(br, argv[3], argv[4]).将此处的参数传递给下面具体的执行函数.
return 0;
//在brctl.h中,struct command
//{
// int needs_bridge_argument;
// char *name;
// void (*func)(struct bridge *br, char *arg0, char *arg1);
//};
help:
help();
return 1;
}
Ps: static struct command commands[] = {
{0, "addbr", br_cmd_addbr},
{1, "addif", br_cmd_addif},
{0, "delbr", br_cmd_delbr},
{1, "delif", br_cmd_delif},
{1, "setageing", br_cmd_setageing},
{1, "setbridgeprio", br_cmd_setbridgeprio},
{1, "setfd", br_cmd_setfd},
{1, "setgcint", br_cmd_setgcint},
{1, "sethello", br_cmd_sethello},
{1, "setmaxage", br_cmd_setmaxage},
{1, "setpathcost", br_cmd_setpathcost},
{1, "setportprio", br_cmd_setportprio},
{0, "show", br_cmd_show},
{1, "showbr", br_cmd_showbr},
{1, "showmacs", br_cmd_showmacs},
{1, "stp", br_cmd_stp},
};
在brctl.c的源码中.可以了解到通过命令的执行机制模式.通过此模式,可以了解到其它命令集合的运行状态及参数传递的方式..