4

私の C クラスは、非常に小さなシェルの実装で構成されています。

私たちのシェルは、ユーザーの入力行で内部コマンド (cd や exit など) をチェックし、何も見つからない場合は、入力行を forks() および execs() します。

誰にでもできるフォークを実装したいと思います (これは、このクラスの義務の範囲をはるかに超えています。私に宿題をするように頼まないでください。これは、Linux の内部構造をより理解するための個人的な調査です)。 . 私の現在のアプローチはこれです:

t = fork();             
if (t < 0) {            
  if (errno == ENOSYS) {                                
    printf("fork() is not supported on this platform. Minishell will not work.");
    break;
  }
  else if (errno == ENOMEM) {   
    printf("No free kernel memory. Minishell will exit.");
    break;
  }
  else {        
    int try = 0;
    while (t < 0 && try < 10) {
      try++;
      t = fork();
    }
  }
  continue;
}

私の理解では、ENOSYS ではフォークが許可されていないため、終了します。 ENOMEM はカーネル メモリの問題を示しているため、給与をはるかに超えています (私は給料が支払われていません。私は学生です;))。したがって、終了します。2 つのフレーバーがある EAGAIN のままです。どちらも fork() を待機して再度呼び出すことで解決できます。

前の演習では、1 万回のフォークを開始し、私の記憶が正しければ、上記のようなカウンターを実装するまで、約 1500 回の失敗がありました。このことをより単純な方法で実装したい場合、どうすればよいでしょうか? 特に、ハードコーディングされた 10 回の試行はちょっとばかげていると思います。

ありがとう。

4

2 に答える 2

2

EAGAINプロセス/子が多すぎることを示します。

サブコマンドの有効期間がかなり短い場合は、waitそのうちの 1 つを終了する方法が有効です。しかし、シェルの子以外のプロセスが原因でリソース (プロセスまたはメモリ) が不足している場合は、運が悪いです。

于 2013-11-08T15:40:15.293 に答える