1

クラスの割り当てのために、独自の基本的なシェルを作成しています。他の関数の中でも特に、絶対パスを処理し、fork() と execv を使用して外部アプリケーションを実行できる必要があります。

アイデアは、プログラムが子プロセスをフォークし、その子プロセスを置き換える execv を呼び出し、外部実行が完了すると終了するというものです。

残念ながら、私はこれに関するクラスに参加できませんでした。オンラインで見つけたいくつかの例を試しましたが、どれも機能しませんでした。問題は、親プロセスが execv コマンドを複製し、それ自体を終了させることです。現在、「/bin/ls」を実行してシェルのメインループに戻ろうとしています。

これが問題のコードです。シンプルなものが欠けていると思います。はい、これは教授にとって良い質問ですが、彼は金曜日のオフィスアワーを守っていないので、メールの返信を何時間も何日も待ちたくありません。:P 同様に、より良いエラーチェックを実装する必要があることもわかっています。今は基本的な機能に取り組んでいます。あとで機能を追加します。

以下のすべての変数が適切な値を持っていることを確認しました。問題は、execv の後にのみ子プロセスを閉じ、親が同じことをしないようにするにはどうすればよいかということです。

TLDR: fork/execv の使い方を独学で学んでいて、自分がまったく無知であることがわかりました。

161 pid_t child = fork();
162 
163 if(child != -1) 
164   if(token[0] == '.' || token[0] == '/') 
165     if(access(token, X_OK) == 0) {
166       char** charArgs = toCharMatrix(args);
167       execv(token, charArgs);
169     } 
4

1 に答える 1

1

親は子プロセスが終了するまで待つ必要があります...そして、子と親を識別するために、forkによって返されたプロセスIDを使用します..以下の例を参照してください:

int runcmd(char *cmd)
{
  char* argv[MAX_ARGS];
  pid_t child_pid;
  int child_status;

  parsecmd(cmd,argv);
  child_pid = fork();
  if(child_pid == 0) {
    /* This is done by the child process. */

    execv(argv[0], argv);

    /* If execv returns, it must have failed. */

    printf("Unknown command\n");
    exit(0);
  }
  else {
     /* This is run by the parent.  Wait for the child
        to terminate. */

     do {
       pid_t tpid = wait(&child_status);
       if(tpid != child_pid) process_terminated(tpid);
     } while(tpid != child_pid);

     return child_status;
  }
}
于 2012-10-05T19:21:47.303 に答える