-2

私は現在 C を学んでおり、Minix 仮想マシン内でシェルを作成することに取り組んでいます。これは、ls、cd などの Minix で既に利用可能なライブラリ関数を使用して実行しています...

子プロセスを fork した後、コマンドを実行するのではなく、コア ダンプが発生するという問題が発生しました。

#include<stdio.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>

    /*Initialise variables*/
    int pid;
    char *envp[] = { NULL };
    char userInput[256];

void isParent(){
    int stat;
    waitpid(-1, &stat, 0);
}

int main(int argc, char *argv[]) {

    /*Infinite loop to cause shell to be "permenant"*/
    while(1){
        /*"*" to lead every line*/
        printf("%s","*");
        /*Get user input*/
        scanf("%s", userInput); 
        /*Leave an exit clause, to not be permenantly stuck in loop*/
        if(strcmp(userInput, "exit") == 0){
            exit(1);
        }
        /*create my child process*/
        pid = fork(); 

        /*if process is parent, wait*/
        if (pid != 0){
        isParent(); 
        }
        /*Perform function typed by the user*/
        execve(userInput, &argv[1], envp);          
    }
}

これは私がこれまで取り組んできたコードです。/bin/ls をシェルのパラメーターとして渡すと、1 つのユーザー入力で ls を 2 回出力することができますが、アクションを実行するとシェルが終了します。それはすべきではありません。他の機能を使用して、一度印刷してから、ユーザー入力の待機に戻ることができるようにしたいと考えています。

パラメータを渡さない場合、シェルは「exit」のみを受け入れ、他のコマンドは受け入れません。メイン メソッド、execve、またはその両方から引数句 (argv[]) を削除すると、予期されるエラーがスローされます。

私が使用したすべての関数のドキュメントを読み、それらを具体的に選択したので、私が行っていることが実際に不可能でない限り、それらを変更する必要がないことを感謝します.

まだ C を学んでいるので、専門用語を短くしたり、フレーズを理解しやすくしたりしていただければ幸いです。私の問題が以前に質問として提起されたかどうかはよくわかりませんが、約20の異なる方法で問題をグーグル検索しましたが、問題のほとんどのバージョンはc ++、c#用に作成されているか、私のものと似ていません問題、私の理解から。

私はまだ数時間いるので、情報を逃した場合は、お気軽にコメントして、説明や情報などを求めてください.

4

1 に答える 1

0

変化する:

    /*if process is parent, wait*/
    if (pid != 0){
    isParent(); 
    }
    /*Perform function typed by the user*/
    execve(userInput, &argv[1], envp);

に:

    /*if process is parent, wait*/
    if (pid != 0){
    isParent(); 
    }
    else
    {
    /*Perform function typed by the user*/
    execve(userInput, &argv[1], envp);
    _exit(0); /* just in case */
    }
于 2015-11-05T22:46:46.673 に答える