c语言 - 为什么execv在排序命令中不起作用



你好,我想在分叉子进程中使用execv函数来执行终端中的ls,grep,sort,awk等命令。然而,ls,grep工作,但sort,awk和其他东西不工作,execv返回-1失败。argv的输入是"sort t.txt",stdinargv[0]=sort,argv[1]=t.txt。例如,当我输入grep 5 t.txt时,它在t.t txt中打印出3个数字,其中包括5,ls打印出目录中的每个文件。为什么只有lsgrep可以工作,而其他命令不行?

char* command(char** argv) {
char* ptr = malloc(200);
if (!strcmp(argv[0], "ls") || !strcmp(argv[0], "man") || !strcmp(argv[0], "grep")
|| !strcmp(argv[0], "sort") || !strcmp(argv[0], "awk") || !strcmp(argv[0], "bc")) {
sprintf(ptr, "/bin/%s", argv[0]);
}
return ptr;
}

//inside fork=
char* pos = command(argv);
if (execv(pos, argv) < 0) {
printf("%sn", argv[0]);
if(argv[1]!=NULL)
printf("%sn", argv[1]);
if(argv[2]!=NULL)
printf("%sn", argv[2]);
perror("execv");
fprintf(stderr, "%s: Command not found.n", argv[0]);
free(pos);
exit(0);
}
free(pos);
mini> sort t
sort
t
execv: No such file or directory
sort: Command not found.
mini> ls
Makefile  minishell.c  pa2  t
mini>

问题在于您硬编码了要在/bin/中找到的命令,而一些命令(如sort命令)不在该位置(sort通常在/usr/bin/中)。

要解决这个问题,并且能够在标准路径中使用任何命令,请使用execvp代替:

execvp(argv[0], argv);

execv不同的是,execvp将使用环境变量PATH来搜索命令。

请阅读exec系列手册页,了解不同版本的详细信息。

最新更新