如何使用execvp - 查找文件参数

时间:2015-09-17 15:49:16

标签: c unix execvp

我编写了一个测试程序,试图了解如何使用execvp(),但我一直遇到问题。我的代码的相关部分是:

...
printf("execute: 'ls -a'\n"); 
char *args[2];
args[0] = "/bin/ls";
args[1] = "ls";
args[2] = "-a";
...
} else if(pid == 0){ //child process
    if(execvp(*args, args) < 0) { //execute command
        fprintf(stderr, "Error: execution failed\n");
        exit(1);
    }
}
...

每当我运行时,我都会收到错误“/ bin / ls:无法访问ls:没有这样的文件或目录”。 which ls告诉我/ bin / ls所以我不明白我做错了什么。是因为可执行文件不在我的主目录中,而是项目文件?

3 个答案:

答案 0 :(得分:3)

这里有几个问题:

args被定义为一个2元素数组,但你要放入3个元素,所以你要写过数组的末尾。

args数组需要有一个NULL指针作为最后一个元素,否则execvp将不知道它何时到达参数列表的末尾。

args中的第一个元素应该是程序的名称(这是ps列表中显示的内容),后续元素应该是参数。现在的方式是,你有ls作为数组中的第二个元素,这意味着它是命令/bin/ls的第一个参数。因此ls命令尝试在当前目录中找到名为ls的文件但不能。这解释了您收到的错误消息。

应用修复程序:

...
printf("execute: 'ls -a'\n"); 
char *args[3];
char *path = "/bin/ls";
args[0] = "ls";
args[1] = "-a";
args[2] = NULL;
...
} else if(pid == 0){ //child process
    if(execvp(path, args) < 0) { //execute command
        fprintf(stderr, "Error: execution failed\n");
        exit(1);
    }
}

答案 1 :(得分:1)

C - error when attempting to pass /bin/ls to execvp

相同的问题

您基本上必须使用NULL指针终止指针数组。

答案 2 :(得分:1)

我真的认为代码是

char *args[3];
args[0] = "/bin/ls";
args[1] = "-a";
args[2] = NULL;

char *args[2];
args[0] = "/bin/ls";
args[1] = "ls";
args[2] = "-a";