我正在尝试实现自己的shell,有很多东西不能用于它但是现在我正试图解决第一个错误。 当我的shell运行并且我输入exit作为第一个命令时,它工作正常,但是,当我输入exit作为第二个输入我应该写出退出额外的时间让它退出我的shell,如果我输入它作为第3个命令,我必须再输入2次,依此类推。 这是我的代码。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
int argumentsnum;
int status;
char *arguments[30];
char *temp;
int processes_count=0;
printf("My Shell\n");
while (1)
{
char input[60];
printf("Enter command\n");
while (fgets(input, sizeof(input), stdin) == NULL)
{
printf("Enter command \n");
} /*end whileloop*/
for (argumentsnum = 0; argumentsnum < 31; argumentsnum++)
{
temp = strtok(input, " \t\n");
if (temp != NULL)
{
arguments[argumentsnum] = temp;
} /*endif*/
} /*end forloop*/
if (strcmp(arguments[0], "exit") == 0)
{
printf("Exiting shell\n");
int i;
For(i=0;i<processes_count;i++){
exit(0);
}
} /*endif*/
pid_t id = fork();
processes_count++;
if (id == -1)
{
perror("Grab your own fork :@ \n");
exit(1);
} /*endif*/
else if (id == 0)
{
execvp(arguments[0], arguments);
} /*endelse*/
else
{
wait(&status);
}
} /*end while(1)*/
} /*endmain*/
答案 0 :(得分:2)
execvp(arguments[0], arguments);
如果此次调用失败,您需要执行某些操作。如果execvp
因为您传递了错误命令而失败,则子进程将继续运行。这意味着 child 将处理下一个命令,而不是 parent 。父母将被卡在wait()
电话中,等待孩子终止。
execvp(arguments[0], arguments);
perror("execvp");
_Exit(1);