LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 812|回复: 3

GNU里边shellutils包里的uptime.c有一段代码.......

[复制链接]
发表于 2007-2-22 18:29:30 | 显示全部楼层 |阅读模式
  1.   switch (argc - optind)
  2.     {
  3.     case 0:                     /* uptime */
  4.       uptime (UTMP_FILE);
  5.       break;

  6.     case 1:                     /* uptime <utmp file> */
  7.       uptime (argv[optind]);
  8.       break;

  9.     default:                    /* lose */
  10.       error (0, 0, _("too many arguments"));
  11.       usage (1);
  12.     }
复制代码


为什么argc和optind要相减?有什么作用?为什么要判断case 0 和case 1?
发表于 2007-2-22 21:07:02 | 显示全部楼层
Fileutils, Shellutils,  Textutils 合并为 coreutils 了。看了一会儿,也不太明白。

argc 和 optind 相减可以得到在 getopt 处理完选项以后剩余的命令行参数的个数,但是代码中调用 getopt_long 时实际上根本就没有指定要处理什么选项,直接传了一个 NULL,这也就是说应该没有参数了,看不懂……

而且从 uptime 的实际行为来看,使用错误的命令行选项时我连程序中的 useage 函数应该打印的消息都没有看到,更加不明白了。

等待牛人。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-2-22 21:41:21 | 显示全部楼层
       If there are no more option  characters,  getopt()  returns  -1.   Then
       optind  is  the  index in argv of the first argv-element that is not an
       option.
这是man手册里的一段话按照我的翻译是说如果getopt返回-1,那样optind变量就是指向argv中第一个不是选项(就是不带"-"?)的argv元素。
这样说这里的optind应该指向argv[0]?那么optind是0还是1?
或者说是除了argv[0]的元素??我觉得这个比较合理。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-2-24 14:41:04 | 显示全部楼层
这里提供网络上一位兄弟的例子,这个例子可以对这个问题有一定的帮助
如果把"ab:c::"改成“”的话,就会发现optind一直等于1.
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. int main(int argc, char **argv)
  5. {
  6.     int result;
  7.     opterr = 0;
  8.     while( (result = getopt(argc, argv, "ab:c::")) != -1 )
  9.     {
  10.            switch(result)
  11.           {
  12.               
  13.               case 0:
  14.                    printf("case 0\n result=%c \n optind=%d ",result,optind);
  15.                    break;
  16.               case 'a':
  17.                    printf("option=a, optopt=%c, optarg=%s\n", optopt, optarg);
  18.                    break;
  19.               case 'b':
  20.                    printf("option=b, optopt=%c, optarg=%s\n", optopt, optarg);
  21.                    break;
  22.               case 'c':
  23.                    printf("option=c, optopt=%c, optarg=%s\n", optopt, optarg);
  24.                    break;
  25.               case '?':
  26.                     printf("result=?, optopt=%c, optarg=%s\n", optopt, optarg);
  27.                     break;
  28.               default:
  29.                    printf("default, result=%c\n",result);
  30.                    break;
  31.            }
  32.         printf("argv[%d]=%s\n", optind, argv[optind]);
  33.     }
  34.     printf("result=-1, optind=%d argc=%d\n", optind,argc);
  35.     for(result = optind; result < argc; result++)
  36.          printf("-----argv[%d]=%s\n", result, argv[result]);
  37.     for(result = 1; result < argc; result++)
  38.           printf("\nat the end-----argv[%d]=%s\n", result, argv[result]);
  39. return 0;
  40. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表