私はオペレーティング システムのコース用にこのシェルを作成しましたが、何らかの理由で「exit」と入力してもメイン関数が終了せず、while ループから抜け出し、main に 0 を返し、プログラムを終了する必要がありますが、代わりに、それはただ続けます。
実際、それは「終了する試合」を教えてくれ、通常どおり実行し続ける while ループに戻ります。
誰かが問題を見ますか?ご協力ありがとうございました
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define LENGTH 1000
#define MAXCMD 11
void init(char *temp);
void clean(char **orderedIds);
int main (int argc, char *argv[], char *envp[])
{
char temp[LENGTH];
char * tok;
char c = '\0';
int *ret_status;
pid_t pid;
printf("\n$");
int i, j = 0;
while(c !=EOF)
{
//while not ^D // Source: LinuxGazzette Ramankutty
c = getchar();
if(c=='\n')
{ //enter command
char **orderedIds = malloc(MAXCMD * sizeof(char*));
for (i=0; i<MAXCMD; i++)
{
orderedIds[i] = malloc(MAXCMD * sizeof(char*));
}
int k=0;
tok = strtok(temp, " ");
while (tok !=NULL)
{
strcpy(orderedIds[k], tok);
k++;
tok = strtok (NULL, " ");
}
orderedIds[k] = NULL; //END with NULL
init(temp); //initialize the array
pid = fork();
if (pid != 0)
{
//printf("Waiting for child (%d)\n", pid);
pid = wait(ret_status);
}
else
{
if (strcmp(orderedIds[0],"exit")==0)
{ //check for exit
printf("Thank you, now exiting\n");
break;
}
if (execvp(orderedIds[0], orderedIds))
{
printf("%s\n", orderedIds[0]);
puts(strerror(errno));
exit(127);
}
}
clean(orderedIds);
printf("%s", &c);
printf("$ ");
}
else
{
strncat(temp, &c, 1);
}
}
printf("\n I'm a bout to exit!");
return 0;
exit(0);
}
void init(char *temp)
{
//Function to initialize/rest=et the array
int i;
for(i=0; i<LENGTH; i++)
{
temp[i] = 0;
}
}
void clean(char **orderedIds)
{
//garbage collection
int i;
for(i=0; i<MAXCMD; i++)
{
free(orderedIds[i]);
}
free(orderedIds);
}