使用c程序中的选项执行命令

时间:2011-04-11 07:59:55

标签: c command argv execvp

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

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

但我不知道该怎么做。

我的程序使用fork。

我这样试试:

pid = fork();

if(pid == 0){

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

}else{

wait(NULL);

}

但它不起作用。

我想作为execvp的第二个参数传递数组,其中args传入命令,但我对指针有点混淆(指针指针更多:s)。

我知道这不会起作用,因为争论中的冲刺,但即使我不使用破折号,程序也只启动'ls'而不用处理'la'选项。

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

谢谢。

2 个答案:

答案 0 :(得分:1)

system

Quoth Wikipedia:

  

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

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

答案 1 :(得分:0)

这里有几个问题。

  1. 您无法处理fork()失败的情况。

  2. 您没有处理execvp()失败的情况。如果你打印strerror(errno),它可能会告诉你为什么你的高管失败了。

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

    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指针,以便您可以诊断任何问题。