execv 适用于“/bin/ls”但不适用于 "pwd"
execv works for "/bin/ls" but not "pwd"
我是 Unix 上的 C 编程语言的新手,正在尝试构建一个类似于 shell 的 C 程序。但是,如果我尝试根据自己的选择更改功能,程序会出错。 例如,/bin/ls -l 似乎在工作,但 pwd 不工作。这可能很简单,但我无法理解这个问题。
if (fork() == 0)
{
char* argv[3];
argv[0] = "/bin/ls";
argv[1] = "-l";
argv[2] = NULL;
if(execv(argv[0], argv)==-1)
printf("Error in calling exec!!");
printf("I will not be printed!\n");
}
此功能有效。我可以清楚地看到 shell 上的结果。
但是,如果我想这样更改,它会打印错误。
if(fork() == 0){
char * argv[2];
argv[0] = "pwd";
argv[1] = NULL;
if(execv(argv[0], argv) == -1)
printf("Error in calling exec!");
}
execv
函数不搜索 运行 命令的路径,因此无法找到 pwd
。它 可以 找到 ls
因为您指定了可执行文件的完整路径。请改用 execvp
,它会进行路径搜索。
此外,使用 perror
打印 library/system 函数的错误消息。它会告诉你函数失败的原因。
if(execvp(argv[0], argv) == -1)
perror("Error in calling exec!");
我是 Unix 上的 C 编程语言的新手,正在尝试构建一个类似于 shell 的 C 程序。但是,如果我尝试根据自己的选择更改功能,程序会出错。 例如,/bin/ls -l 似乎在工作,但 pwd 不工作。这可能很简单,但我无法理解这个问题。
if (fork() == 0)
{
char* argv[3];
argv[0] = "/bin/ls";
argv[1] = "-l";
argv[2] = NULL;
if(execv(argv[0], argv)==-1)
printf("Error in calling exec!!");
printf("I will not be printed!\n");
}
此功能有效。我可以清楚地看到 shell 上的结果。 但是,如果我想这样更改,它会打印错误。
if(fork() == 0){
char * argv[2];
argv[0] = "pwd";
argv[1] = NULL;
if(execv(argv[0], argv) == -1)
printf("Error in calling exec!");
}
execv
函数不搜索 运行 命令的路径,因此无法找到 pwd
。它 可以 找到 ls
因为您指定了可执行文件的完整路径。请改用 execvp
,它会进行路径搜索。
此外,使用 perror
打印 library/system 函数的错误消息。它会告诉你函数失败的原因。
if(execvp(argv[0], argv) == -1)
perror("Error in calling exec!");