【问题标题】:C: execvp() and command line argumentsC: execvp() 和命令行参数
【发布时间】:2014-03-20 16:46:48
【问题描述】:

所以我正在编写一个程序,其中参数如下

program start emacs file.c

甚至

program wait

本质上,第一个参数 (argv[0]) 是程序名称,然后是用户输入。

在我的代码中,我调用 execvp。问题是,我不完全确定我引用了正确的论点。

if (pid == 0) { 
                    execvp(argv[1], argv); //Line of interest
                    exit(1);
                    }

argv[1] 和 argv 是传递上述功能的正确参数吗?我查看了手册页,它们是有道理的,但对于这种情况可能不正确。 谢谢!

【问题讨论】:

  • 您会从答案中注意到共同主题:execvp(cmds[n], &cmds[n]); 或同等主题。也就是说,您将参数数组的第 n 个元素作为第一个参数传递给 execvp(),并将参数数组的第 n 个元素的地址作为第二个参数传递 - 在您的特定情况下,execvp(argv[1], &argv[1]); .显然,您在技术上没有义务这样做(参数是独立的),但您需要一个很好的理由才能这样做。

标签: c execvp


【解决方案1】:

在您的 main 中,第一个示例中的 argv 将是这样的:

argv[0] = "program";
argv[1] = "start";
argv[2] = "emacs";
argv[3] = "file.c";
argv[4] = NULL;

在 execv 中你想用 args "emacs file.c" 执行程序 "start",对吧?那么第一个参数应该是 argv[1] - “start”,第二个参数应该是一个包含以下字符串的数组:{“start”、“emacs”、“file.c”、NULL}。如果使用 argv,则在 argv[0] 中包含“程序”字符串。

您可以创建一个新数组并复制这些参数或使用 argv[1] 的地址,如下所示:

execvp(argv[1], &argv[1]); //Line of interest

【讨论】:

    【解决方案2】:

    唯一可能存在问题的是argv 中的argv[0] 传递给execvpargv[1](第一个参数)不匹配。否则,它看起来还不错。

    想象一下打电话给program cat file.txt。在您的程序中,argv 将是{"program", "cat", "file.txt", NULL}。然后,在 cat 中,即使调用的二进制文件是 cat,argv 仍然是 {"program", "cat", "file.txt", NULL}

    由于cat 尝试将每个参数作为文件打开和读取,它会尝试打开的第一个文件是cat (argv[1]),这不是所需的行为。

    简单的解决方案是使用execvp(argv[1], argv+1) - 这实际上将参数数组向左移动一个元素。

    【讨论】:

      【解决方案3】:

      我的理解是您想根据第二个命令行参数 (argv[1]) 采取特定操作。如果第二个参数是'start',你的程序应该使用之后提供的参数启动名为argv[2] 的可执行文件(对吗?)。在这种情况下,您应该向 execvp 提供可执行文件名称 (argv[2]) [1] 和参数列表,按照惯例,参数列表以可执行文件的名称 (argv[2]) 开头。

      execvp(argv[2], &argv[2]) 将实现我们在上一段中描述的内容(假设这是您打算做的)。

      [1] execvp 需要 2 个参数,如您所知。第一个是文件名;如果指定的文件名不包含斜杠字符 (/),execvp 将在 PATH 环境变量(其中包含可执行文件所在的目录列表)中查找可执行文件的完全限定名称。第二个参数是程序启动时可用的命令行参数列表。

      【讨论】:

      • 我很确定,根据第二个示例,argv[1] 是预期的目标可执行文件。
      猜你喜欢
      • 2014-10-23
      • 2021-03-16
      • 1970-01-01
      • 2021-11-26
      • 2021-01-02
      • 2020-07-15
      • 2020-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多