Chinaunix首页 | 论坛 | 博客
  • 博客访问: 28397
  • 博文数量: 14
  • 博客积分: 772
  • 博客等级: 军士长
  • 技术积分: 125
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-07 17:27
文章分类

全部博文(14)

文章存档

2010年(7)

2009年(6)

2008年(1)

我的朋友

分类: 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的源码中.可以了解到通过命令的执行机制模式.通过此模式,可以了解到其它命令集合的运行状态及参数传递的方式..

阅读(828) | 评论(0) | 转发(0) |
0

上一篇:杂谈--他山之石

下一篇:windows消息队列

给主人留下些什么吧!~~