gpt4 book ai didi

c - Execvp(argv[1], argv),不返回那个文件或目录

转载 作者:太空宇宙 更新时间:2023-11-04 11:45:07 27 4
gpt4 key购买 nike

我正在编写一个接受参数的 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] 是“程序的名称”,因此当您的程序被调用时,它将类似于 ./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 - Execvp(argv[1], argv),不返回那个文件或目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58053649/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com