到目前为止,我唯一困惑的部分是如何使用第一个参数设置execv作为当前工作目录。我试过两个“。”和“〜”,都没有对屏幕执行任何操作;同样的“/。”和“/〜”。我很困惑如何让execv运行这样的事情:
$ ./prog ls -t -al
并让它在程序执行后执行命令(存储在argv中)在当前目录中执行,或者在文件所在的目录中执行(根据使用者的不同而不同)。
我的代码:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
void main(int argc, char *argv[])
{
int pid;
int count = 0;
char *argv2[argc+1];
for(count = 0; count < argc-1; count++){
argv2[count] = argv[count+1];
printf("Argv2: %s\n", argv2[count]); //just double checking
argv2[argc-1] = NULL;
}
pid = fork();
if(pid == 0){
printf("Child's PID is %d. Parent's PID is %d\n", (int)getpid, (int)getppid());
execv(".", argv2); //<---- confused here
}
else{
wait(pid);
exit(0);
}
}
一些样本输出:
$ ./prog ls -t -al
Argv2:ls
Argv2:-t
Argv2:-al
孩子的PID是19194.父母的PID是19193
答案 0 :(得分:3)
我猜 execv 是需要使用的。 execvp 非常好,因为它会在您的PATH设置中查找命令。
execv(".", argv2); //<---- confused here
...
#include <errno.h>
#include <string.h>
if ( execv(argv2[0],argv2) )
{
printf("execv failed with error %d %s\n",errno,strerror(errno));
return 254;
}
wait(pid);
...
pid_t wait_status = wait(&pid);
答案 1 :(得分:1)
按照惯例,第一个参数应指向与正在执行的文件关联的文件名。
你想执行ls
,所以第一个参数应该是/bin/ls
,这意味着代码是
execv("/bin/ls", argv2);
你可以尝试一下
答案 2 :(得分:1)
/* main() returns int */
int main(int argc, char *argv[])
{
int pid;
pid = fork();
if(pid == 0){
printf("Child's PID is %d. Parent's PID is %d\n"
, (int)getpid, (int)getppid());
execv(argv[1], argv+1);
}
else{
wait(NULL);
exit(0);
}
return 0;
}
更新:execv()需要可执行文件的绝对路径;对于当前目录中的文件,您必须构造该路径(例如,通过pwd())。如果你想通过$ PATH环境变量来访问可执行文件,你可以使用execvp(),它会为你完成所有的搜索。
答案 3 :(得分:0)
execv()的第一个arg不是要运行的目录,而是要执行的文件的路径。默认情况下,您执行的程序将在调用者的当前目录的上下文中运行。
答案 4 :(得分:0)
第一个参数是您要运行的程序的绝对路径;换句话说,您在终端中键入的命令的第一部分。您可以使用命令whereis
找到程序的位置。此外,execv
函数可以为您查找路径,这使您的代码更具可移植性。
答案 5 :(得分:0)
代码示例供您参考:
Context