【问题标题】:execute commands with options in a c program在 c 程序中执行带有选项的命令
【发布时间】:2011-08-02 20:52:09
【问题描述】:

我正在尝试在 c 程序中执行带有参数的命令。 例如,当用户执行我的程序时: "./a.out ls -la"

程序应该使用 la 选项执行 ls。

但我不知道该怎么做。

我的程序使用了 fork。

我试试这个方法:

pid = fork();

if(pid == 0){

execvp(argv[1], &argv[2]);

}else{

wait(NULL);

}

但它不起作用。

我想将带有 args 的数组作为 execvp 的第二个参数传递给命令,但我对指针有点困惑(以及更多关于指针的指针:s)。

我知道这不起作用,因为参数中的破折号,但即使我不使用破折号,程序也只会启动“ls”而不考虑“la”选项。

如果有人可以帮助我,我会很高兴知道这样做的好方法。

谢谢。

【问题讨论】:

    标签: c command argv execvp


    【解决方案1】:

    system

    Quoth 维基百科:

    在 C 标准库中,system 是用于执行子进程和命令的函数。它在 stdlib.h 头文件中定义。它与 exec/spawn 系列函数的不同之处在于,它不是将参数传递给已执行的对象,而是将单个字符串传递给系统 shell,通常是 POSIX shell,/bin/sh -c。

    http://en.wikipedia.org/wiki/System_(C_standard_library)

    【讨论】:

    • 不要使用system(),这是垃圾。正确的方法是使用fork和exec。
    【解决方案2】:

    这里有几个问题。

    1. 你不处理fork()失败的情况。

    2. 您不处理execvp() 失败的情况。如果您打印strerror(errno),它可能会为您提供有关执行失败原因的线索。

    3. execvp() 采用 char* const 数组,该数组必须以 NULL 作为其最后一个元素。此外,第一个元素应该是程序的名称。这是一个约定,但这确实意味着,在您的示例中,参数相差一个。即ls 认为它已被-la 的命令调用且没有参数。我不确定argv[]是否保证在结束后有一个NULL指针,所以不要直接使用它。例如

      char* args[3];
      args[0] = argv[1]; // You have already checked argc is at least three right?
      args[1] = argv[2];
      args[2] = NULL;
      // do your fork and error check then in the child
      
      int result = execvp(argv[1], args);
      // if you get here exec failed, handle as appropriate
      
    4. 您需要检查wait() 的退出值,并且您应该传递一个合法的int 指针,以便您可以诊断任何问题。

    【讨论】:

      猜你喜欢
      • 2012-06-06
      • 2012-05-12
      • 1970-01-01
      • 2012-02-25
      • 1970-01-01
      • 2012-01-03
      • 1970-01-01
      • 2014-05-28
      • 2013-09-04
      相关资源
      最近更新 更多