私の 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 回の試行はちょっとばかげていると思います。
ありがとう。