像snmpget这样的c应用程序有什么参数?

时间:2014-08-08 09:41:01

标签: c snmp net-snmp

我想从同一项目中的另一个c程序中调用snmpget.c。出于这个原因,我已将main()更改为函数说get_func(),它采用相同的参数。但我不知道如何提出论据argv[0] 我的论点看起来像这样:

char *argstr[]=
{
        "v",
        "1",
        "c",
        "public",
        "-Ovq",
        "192.168.1.1",
        "ifInOctets.7",
        "ifOutOctets.7",
        NULL
};

然后

i = get_func(10, argstr);

1. argv[0]应该是应用名称还是路径?

2.使用char *argstr[]更正c?

3. snmpget没有正确地接受这些论点。原因是什么?

它在命令中使用相同的args正常工作。

2 个答案:

答案 0 :(得分:1)

  1. 是的,如果您main使用它。如果没有,只需通过NULL足够> o<

  2. 当然,它是指针的数组。 char *argstr[9]等于

    typedef char *pchar;
    pchar argstr[9];
    
  3. 好吧,我假设你没有提供适当的argc而且没有通过argv[0]传递应用名称,因为argc10,但是argv的内容数量为8.(我已将其排除在NULL之外,但NULL尚未确定 - argv[argc]应为NULL。)
    为了减少错误,我建议您使用sizeof(argstr) / sizeof(argstr[0]) - 1而不是自己计算argc

  4. live example。代码:

    #include <stdio.h>
    
    int test(int argc, char *argv[]);
    
    int main()
    {
        char *argstr[] = {
            "test.exe",
            "--opt-1",
            "--output",
            "test.txt",
            NULL
        };
        int argcount = sizeof(argstr) / sizeof(argstr[0]) - 1;
        return test(argcount, argstr);
    }
    
    int test(int argc, char *argv[])
    {
        int i;
    
        printf("argc: %d\n", argc);
        printf("program name: %s\n", argv[0]);
        for (i = 1; argv[i] != NULL; i++)
        {
            printf("argument %d is: %s\n", i, argv[i]);
        }
        return 0;
    }
    

    输出:

    argc: 4
    program name: test.exe
    argument 1 is: --opt-1
    argument 2 is: --output
    argument 3 is: test.txt
    

答案 1 :(得分:1)

  1. 您的get_func期望参数从argv[1]开始,因此您的argstr参数不应以"v"开头,而应使用其他内容(例如程序名称或仅为空如果get_func不使用它,则为字符串。)
  2. 是。但请注意,您的argstr包含不可修改的字符串,如果get_func想要修改它们,则可以使用复合文字

    char *argstr[]=
    {
            (char []){ "v" },
            (char []){ "1" },
            /* etc */
            NULL
    };
    
  3. 请参阅1.和2.此外,argc不正确(必须为sizeof argstr/sizeof *argstr - 1,在您的情况下为8,而不是10)。


  4. 不直接回答您的问题,但请考虑重新设计(取决于您目前正在做什么)。例如,编写一个接受存储不同选项(已经解析和验证)的结构的函数,并将旧的main snmpget.c 更改为仅扫描和验证参数的函数,初始化这样的结构对象,并调用此函数。然后,或许将您的文件拆分为 snmpget.c snmpget_main.c another_c_file.c (当然还有更好的名称)和链接针对 snmpget.c 的目标文件的用户界面实现。