你好,我想在分叉子进程中使用execv
函数来执行终端中的ls
,grep
,sort
,awk
等命令。然而,ls
,grep
工作,但sort
,awk
和其他东西不工作,execv
返回-1
失败。argv
的输入是"sort t.txt"
,stdin
和argv[0]=sort
,argv[1]=t.txt
。例如,当我输入grep 5 t.txt
时,它在t.t txt中打印出3个数字,其中包括5,ls
打印出目录中的每个文件。为什么只有ls
和grep
可以工作,而其他命令不行?
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
系列手册页,了解不同版本的详细信息。