Execvp(argv[1], argv),不返回那个文件或目录
Execvp(argv[1], argv), returning no such file or directory
我正在编写一个接受参数的 C 程序,char *argv[]
来决定 exec()
到 运行。我有 execlp(argv[1], argv[1], NULL)
可以正常工作。由于某种原因 execvp(argv[1], argv)
无法找到 'ls' 到 运行 的命令。我真正需要的是如果我有多个参数,不包括调用 ./filexec
,我可以 运行 一个 exec()
将采用 char* argv[]
而不包含文件路径.我的理解是 execvp()
有能力做到这一点。
我正在 运行在 ssh linux 服务器上安装这个。
int main(int argc, char *argv[])
{
pid_t pid;
/* fork a child process */
pid = fork();
if (pid < 0) {/* error occured */
fprintf(stderr, "Fork Failed");
return 1;
}
else if (pid == 0) {/* child process */
//pass the right thing to the right exec?
if (argc == 1)
{
printf("CHILD started. No arguments provided. Terminating child.\n");
}
if (argc == 2)
{
printf("CHILD started. One argument provided. Calling execlp().\n");
execlp(argv[1],argv[1],NULL);
}
if (argc >= 3)
{
printf("CHILD started. More than one argument provided. Calling execvp().\n");
argv[argc++] = NULL;
execvp(argv[1],argv);
}
}
else {/* parent process */
/* parent will wait for the child to complete */
printf("PARENT started, now waiting for processID#%u\n", getpid());
wait(NULL);
printf("PARENT resumed. Child exit code of 0. Now terminating parent.\n");
}
return 0;
}
我希望给 ./a.out ls -l
打电话给 execvp()
给予:
total XXX
info ---------filename
info ---------filename
等等
请记住 argv[0]
是 "name of the program",因此当您的程序被调用时,它将类似于 ./a.out
。那么argv[1]
就是你程序的第一个参数,也就是你要exec
的程序名,剩下的argv
就是传递给那个程序的其余参数.
因此,您要传递给要执行的程序的 argv
数组从 argv[1]
开始。或者,更准确地说,您要向 exec
提供的程序的 argv
指针是 argv + 1
.
您显然已经为 execlp
的调用找到了答案,因为您指定了 argv[1]
两次,一次是 exec
的程序名称,一次是第一个(也是唯一一个) argv
数组中的元素传递给该程序。您只需要对 execvp
的调用执行相同的操作;而不是 execvp(argv[1], argv)
,您需要 execvp(argv[1], argv + 1)
.
您收到的错误消息来自 ls
实用程序本身。您已使用 execvp
调用了 ls
,将整个 argv
数组传递给它。换句话说,您已经告诉它它的名称是 ./a.out
(这可能有点令人困惑,因为大多数实用程序都使用给定的程序名称来创建错误消息),并且您已经提供了它 ls -l
作为命令行参数。这实际上与命令行相同:
ls ls -l
如果您尝试,很可能会告诉您文件 ls
不存在。 (除非您碰巧在当前目录中有一个名为 ls
的文件。)
顺便说一句:
argv[argc++] = NULL;
完全没有必要。 argv[argc]
已经保证为 NULL,并且您不需要变量 argc
(如果您有一个,您可能需要它少一个,而不是多一个)。
我正在编写一个接受参数的 C 程序,char *argv[]
来决定 exec()
到 运行。我有 execlp(argv[1], argv[1], NULL)
可以正常工作。由于某种原因 execvp(argv[1], argv)
无法找到 'ls' 到 运行 的命令。我真正需要的是如果我有多个参数,不包括调用 ./filexec
,我可以 运行 一个 exec()
将采用 char* argv[]
而不包含文件路径.我的理解是 execvp()
有能力做到这一点。
我正在 运行在 ssh linux 服务器上安装这个。
int main(int argc, char *argv[])
{
pid_t pid;
/* fork a child process */
pid = fork();
if (pid < 0) {/* error occured */
fprintf(stderr, "Fork Failed");
return 1;
}
else if (pid == 0) {/* child process */
//pass the right thing to the right exec?
if (argc == 1)
{
printf("CHILD started. No arguments provided. Terminating child.\n");
}
if (argc == 2)
{
printf("CHILD started. One argument provided. Calling execlp().\n");
execlp(argv[1],argv[1],NULL);
}
if (argc >= 3)
{
printf("CHILD started. More than one argument provided. Calling execvp().\n");
argv[argc++] = NULL;
execvp(argv[1],argv);
}
}
else {/* parent process */
/* parent will wait for the child to complete */
printf("PARENT started, now waiting for processID#%u\n", getpid());
wait(NULL);
printf("PARENT resumed. Child exit code of 0. Now terminating parent.\n");
}
return 0;
}
我希望给 ./a.out ls -l
打电话给 execvp()
给予:
total XXX
info ---------filename
info ---------filename
等等
请记住 argv[0]
是 "name of the program",因此当您的程序被调用时,它将类似于 ./a.out
。那么argv[1]
就是你程序的第一个参数,也就是你要exec
的程序名,剩下的argv
就是传递给那个程序的其余参数.
因此,您要传递给要执行的程序的 argv
数组从 argv[1]
开始。或者,更准确地说,您要向 exec
提供的程序的 argv
指针是 argv + 1
.
您显然已经为 execlp
的调用找到了答案,因为您指定了 argv[1]
两次,一次是 exec
的程序名称,一次是第一个(也是唯一一个) argv
数组中的元素传递给该程序。您只需要对 execvp
的调用执行相同的操作;而不是 execvp(argv[1], argv)
,您需要 execvp(argv[1], argv + 1)
.
您收到的错误消息来自 ls
实用程序本身。您已使用 execvp
调用了 ls
,将整个 argv
数组传递给它。换句话说,您已经告诉它它的名称是 ./a.out
(这可能有点令人困惑,因为大多数实用程序都使用给定的程序名称来创建错误消息),并且您已经提供了它 ls -l
作为命令行参数。这实际上与命令行相同:
ls ls -l
如果您尝试,很可能会告诉您文件 ls
不存在。 (除非您碰巧在当前目录中有一个名为 ls
的文件。)
顺便说一句:
argv[argc++] = NULL;
完全没有必要。 argv[argc]
已经保证为 NULL,并且您不需要变量 argc
(如果您有一个,您可能需要它少一个,而不是多一个)。