3

私はオペレーティング システムのコース用にこのシェルを作成しましたが、何らかの理由で「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);                                                          
}                                                                                  
4

3 に答える 3

2

まあ、それは出ます。問題は、実行をフォークしていることです。何をするにも注意が必要です。子プロセスが終了すると、チェーンのすべての親プロセスが終了するはずだと思います。これをして:

pid = wait(ret_status);

しかし、結果に対して何もしないでください。ところで、waitがポインターを期待しているからといって、初期化されていないポインターを渡す必要があるわけではありません。以下を定義します。

int *ret_status;

あなたが本当にすべきことはこれです:

int ret_status;
pid = wait(&ret_status);

そして、 の値をテストしますret_status。あなた(親プロセス)が終了する必要があることを示している場合は、break.

于 2013-02-11T01:57:00.363 に答える
2

fork() を実行すると、コマンド「exit」をチェックしている子プロセスにあります。子プロセスは実際に終了しますが、親プロセスは実行を続けます。fork() を呼び出す前に、内部コマンド (「exit」など) をチェックする必要があります。

于 2013-02-11T01:59:55.687 に答える
0

作業が終了したら、サブプロセスを強制終了してみてください

 kill(pid);
于 2013-02-11T01:54:19.593 に答える