【问题标题】:How to get list of all command line argument and forward all of those arguments to another command in C如何获取所有命令行参数的列表并将所有这些参数转发到 C 中的另一个命令
【发布时间】:2021-08-26 17:16:52
【问题描述】:

我已经搜索过这个问题,但没有找到任何解决方案。 实际上我想在 C 中创建一个 Compiled,如果我在该文件中输入 ant 参数,那么它将通过 system() 将参数转发给另一个命令 让我解释, 假设,growkl 是我的 C 编译文件。 在终端,我写了这个:

growkl TRYNEW /etc/cron.d ./grill/mk

然后,growkl 文件会将所有这些参数( TRYNEW /etc/cron.d ./grill/mk )转发到命令 /usr/bin/gkbroot 这样:

/usr/bin/gkbroot TRYNEW /etc/cron.d ./grill/mk

我是这些东西的新手,所以我不知道如何做到这一点。 谁能告诉我

【问题讨论】:

  • 命令行参数作为 argv 中的字符串传递给 main。您可以使用 execvp 将它们直接传递给您要调用的命令。

标签: c command-line-arguments


【解决方案1】:

如果你有这样的主要功能:

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

那么 argc 是命令行参数的数量,而 argv[] 是表示参数的字符串数组。值得注意的是 argv[0] 是命令名称(通常)。

您需要使用以下 execv (man execv) 变体之一:

execv(path-of-other-exe, argv)

注意:您应该确保 argv 以 NULL 指针结尾(我认为它来自 main())...并且您可以使用修改后的参数创建新的 argv,但我认为修改不符合犹太教规argv 就位。

但在你的情况下,我想知道你是否只想要一个符号链接(命令 ln -s /usr/bin/gkbroot growkl)

【讨论】:

  • 你说得对,argv 是一个指针数组,其中最后一个参数之后的下一个指针是 NULL 作为标记。您可能希望使用&argv[1] 作为execv 的参数,以避免将当前程序名称作为参数传递。
【解决方案2】:

要使用system(command),您需要将command 字符串与命令行参数中的选项连接 构建成单个字符串。例如,如果您想使用system() 将所有参数作为参数传递给/usr/bin/gkbroot,则需要声明一个足够大的缓冲区(字符数组)以容纳"/usr/bin/gkbroot",并在每个参数和nul 终止 字符。

您可以通过将缓冲区初始化为"/usr/bin/gkbroot",然后循环遍历每个参数,添加space,然后将参数添加到缓冲区(在验证command 缓冲区中存在足够的存储空间之后)。例如:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXC 1024         /* if you need a constant, #define one (or more) */

int main (int argc, char **argv) {
    
    char command[MAXC] = "/usr/bin/gkbroot";
    size_t len = strlen (command);
    
    for (int i = 1; i < argc; i++) {
        size_t arglen = strlen (argv[i]);
        if (len + arglen + 2 > MAXC) {
            fputs ("error: arguments exceed command storage.\n", stderr);
            return 1;
        }
        strcat (command, " ");
        strcat (command, argv[i]);
        len += arglen + 1;
    }
    
    printf ("system (%s)\n", command);
    // system (command);
}

注意:实际的system(command);当前已被注释掉。要执行实际的命令,请取消注释该行)

使用/输出示例

$ ./bin/system_command TRYNEW /etc/cron.d ./grill/mk
system (/usr/bin/gkbroot TRYNEW /etc/cron.d ./grill/mk)

无论您提供多少参数,只要它们适合command,这将起作用,例如

$ ./bin/system_command arg1 arg2 arg3 arg4 arg5 arg6
system (/usr/bin/gkbroot arg1 arg2 arg3 arg4 arg5 arg6)

让我知道这是否是您的意图,如果您还有其他问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 2012-09-18
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    相关资源
    最近更新 更多