0

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

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

但我不知道该怎么做。

我的程序使用叉子。

我尝试这种方式:

pid = fork();

if(pid == 0){

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

}else{

wait(NULL);

}

但它不起作用。

我想将数组作为 execvp 的第二个参数传递,其中 args 在命令中传递,但我对指针(以及指针的指针:s)有点困惑。

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

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

谢谢你。

4

2 回答 2

1

system

Quoth 维基百科:

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

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

于 2011-04-11T08:13:50.190 回答
0

这里有几个问题。

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

  2. 你不处理execvp()失败的情况。如果你打印strerror(errno)它可能会给你一个线索,说明你的 exec 失败的原因。

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

于 2011-04-11T10:06:30.513 回答