我正在尝试像bash这样的命令解释器,我有一点问题。
当我执行像ls / cat / grep这样的现有命令时,它没有问题,但是当我尝试执行像qsdjhkoqd这样的命令时,它会说命令未找到,如果我尝试在它之后退出,它将不会退出。
例如,如果我做了4个不好的评论,我将不得不做5个退出以退出我的程序。 我知道这肯定是一个进程问题,但我不知道如何解决它,你能告诉我我错在哪里吗?
谢谢!
int im_your_father(t_struct *tool, char **env, char **argv)
{
int ret;
ret = 0;
if (tool->command.pid == 0)
{
ret = execve(tool->command.command, argv, env);
}
else
wait(NULL);
return (ret);
}
int execute_path(t_struct *tool , char **env ,
char **argv, t_first_elem *list)
{
int i;
int ret;
tool->command.pid = fork();
(void)list;
i = -1;
if (my_strcmp("ls", argv[0]) == 0)
{
while (argv[++i] != NULL)
;
argv[i] = my_strdup("--color=auto");
argv[++i] = NULL;
i = -1;
}
while (tool->path[++i] != NULL)
{
tool->command.command = my_strdup_mod(tool->path[i],
my_strlen(tool->command.line));
my_strcat(tool->command.command, "/");
my_strcat(tool->command.command, argv[0]);
ret = im_your_father(tool, env, argv);
if (ret != -1)
return (0);
}
if (tool->command.pid == 0)
{
my_putstr("son alive");
}
else
{
printf("%d\n", tool->command.pid);
wait(NULL);
}
my_putstr(argv[0]);
my_putstr(": command not found\n");
return (0);
}
答案 0 :(得分:0)
我认为问题主要出在以下几个方面:
if (tool->command.pid == 0)
{
ret = execve(tool->command.command, argv, env);
}
首先,不需要从execve()
捕获返回值。如果成功,它永远不会回来;如果它完全返回,则失败。
其次,你需要考虑接下来会发生什么,而简短的回答是你现在有两个过程,两个过程都认为它们是你的shell。你现在有两个过程试图阅读你的输入,他们争吵谁得到每个角色,结果是一团糟,就像人类的孩子争吵轮到使用一个受宠的玩具。
大多数情况下,特别是在shell中,如果execve()
失败,您可能希望在产生错误消息后退出:
if (tool->command.pid == 0)
{
execve(tool->command.command, argv, env);
fprintf(stderr, "failed to execute %s (%s)\n", tool->command.command, strerror(errno));
exit(127);
}
确切的退出状态是可以协商的;我通常只使用1
,但POSIX标准在未能执行命令时会规定exit statuses:
如果未找到命令,则退出状态应为127.如果找到命令名称,但它不是可执行实用程序,则退出状态应为126.