我的 C 类包括实现一个非常小的外壳。
我们的 shell 检查用户的输入行是否有内部命令(例如 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 表示内核内存问题 - 远远超过我的工资等级(我没有付钱,我是学生;)),因此我们也退出。仍然是 EAGAIN,它有两种风格,这两种风格都可以通过等待并再次调用 fork() 来解决。
在之前的练习中,我们启动了一万个分叉,如果我没记错的话,大约有 1500 个失败,直到我们实现了一个像我上面的 while 一样的计数器。如果我想以一种不那么天真的方式实现这个东西,我该如何继续?我想,特别是硬编码的十次尝试有点愚蠢。
谢谢。