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

如何使用execvp--查找文件参数,c,unix,execvp,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

我编写了一个测试程序,试图了解如何使用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);
    }
}
...
。。。
printf(“执行:'ls-a'\n”);
char*args[2];
参数[0]=“/bin/ls”;
args[1]=“ls”;
args[2]=“-a”;
...
}如果(pid==0){//子进程
如果(execvp(*args,args)<0){//execute命令
fprintf(stderr,“错误:执行失败\n”);
出口(1);
}
}
...
无论何时运行,我都会收到一个错误“/bin/ls:cannotaccessls:No-this file或directory”
哪个ls
告诉我/bin/ls,所以我不明白我做错了什么。是不是因为可执行文件不在我的主目录中,而是一个项目文件

和这里的问题一样


基本上必须用空指针终止指针数组。

这里有几个问题:

args
被定义为2个元素的数组,但是您要放入3个元素,所以您要写入数组的末尾

args
数组需要有一个空指针作为最后一个元素,否则
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);
    }
}
。。。
printf(“执行:'ls-a'\n”);
char*args[3];
char*path=“/bin/ls”;
args[0]=“ls”;
args[1]=“-a”;
args[2]=NULL;
...
}如果(pid==0){//子进程
if(execvp(path,args)<0){//execute命令
fprintf(stderr,“错误:执行失败\n”);
出口(1);
}
}

我真的认为代码是

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


回答很好,也很正确,但我读了好几遍,才了解到您对
args
的“第一个元素”和exec'ed命令的“第一个参数”的区别。@JohnBollinger谢谢,我做了一些澄清。
char *args[2];
args[0] = "/bin/ls";
args[1] = "ls";
args[2] = "-a";