万无一失的分叉?

捣蛋鬼

我的C类包含实现一个非常小的shell。

我们的shell检查用户的输入行中是否有内部命令(例如cd或exit),如果找不到,则将fork()和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()来解决。

在上一个练习中,我们启动了1万次派生,如果我没记错的话,大约有1500次失败,直到我们像上面的时候那样实现了一个计数器。如果我想以一种不太幼稚的方式实现此东西,该怎么办?我想,特别是硬编码的十次尝试有点愚蠢。

谢谢。

Linuxios的

我认为您当前的重试方法是误解了EAGAIN错误的含义。从Linux手册页:

EAGAIN fork()无法分配足够的内存来复制父级的页表并为子级分配任务结构。

EAGAIN无法创建新进程,因为遇到了调用者的RLIMIT_NPROC资源限制。要超过此限制,该进程必须具有CAP_SYS_ADMIN或CAP_SYS_RESOURCE能力。

第一个与ENOMEM相当,第二个是达到过程上限的问题。除非您希望微型外壳始终使子进程死亡,否则快速连续尝试10次可能无济于事。

我建议您也将EAGAIN变成您的fork代码的致命错误。

但是,如果您的程序可以采取某些措施来减轻内存压力(释放程序缓存等),则可以执行此操作,然后重试一次。

值得一提的是,在正常负载下,任何现代系统上几乎都不存在会导致分叉失败的条件。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

万无一失的分叉?

来自分类Dev

Java中OutOfmemory的万无一失的检测

来自分类Dev

MVC万无一失的验证'Sys is not defined'

来自分类Dev

MVC重新绑定万无一失的验证

来自分类Dev

万无一失的Python计算器

来自分类Dev

如果使用枚举,则需要使用万无一失

来自分类Dev

相同字段上的万无一失的多个验证器

来自分类Dev

万无一失的副本超载:如何不照顾应该默认副本的成员?

来自分类Dev

Maven的万无一失找不到ForkedBooter类

来自分类Dev

无法执行Maven的万无一失,插件,但只能用circleci

来自分类Dev

确保变量存储/回送所有字符的万无一失的方法?

来自分类Dev

使用扫描仪的万无一失的用户输入程序

来自分类Dev

MVC万无一失的验证要求IfFalse错误地返回错误

来自分类Dev

Maven-万无一失。如何调整报表的详细程度?

来自分类Dev

使用JUnit平台 - 神火提供商的Java 9模块Maven的万无一失,插件

来自分类Dev

在CentOS上设置主机名和域的万无一失/正确的方法是什么

来自分类Dev

使用万无一失和requiredif来验证字符串字段

来自分类Dev

有没有一种万无一失的方法来给系统足够的时间在运行copytree之前删除文件夹

来自分类Dev

一种万无一失的方法来检测是否启用了开发人员选项?

来自分类Dev

有没有一种万无一失的方法来检测我的声卡是否支持5.1环绕声?

来自分类Dev

是否有一种简单的万无一失的方法来将命令从Ubuntu转换为Debian,反之亦然?

来自分类Dev

是否有一种万无一失的简便方法来确定哪些debs意味着ubuntu将在debian上安装

来自分类Dev

在 Win10 中,是否有一种万无一失的方法来发现哪个应用程序正在显示给定的弹出窗口?

来自分类Dev

无法加载的魔力 '测试' - org.apache.maven.plugins:Maven的万无一失,插件:3.0.0-M1:测试

来自分类Dev

空无一物

来自分类Dev

分叉服务一启动就重启?

来自分类Dev

LiveConnectClient | DownloadAsync崩溃无一例外

来自分类Dev

以空无一人的身份运行Chromium

来自分类Dev

Laravel 4崩溃无一例外

Related 相关文章

  1. 1

    万无一失的分叉?

  2. 2

    Java中OutOfmemory的万无一失的检测

  3. 3

    MVC万无一失的验证'Sys is not defined'

  4. 4

    MVC重新绑定万无一失的验证

  5. 5

    万无一失的Python计算器

  6. 6

    如果使用枚举,则需要使用万无一失

  7. 7

    相同字段上的万无一失的多个验证器

  8. 8

    万无一失的副本超载:如何不照顾应该默认副本的成员?

  9. 9

    Maven的万无一失找不到ForkedBooter类

  10. 10

    无法执行Maven的万无一失,插件,但只能用circleci

  11. 11

    确保变量存储/回送所有字符的万无一失的方法?

  12. 12

    使用扫描仪的万无一失的用户输入程序

  13. 13

    MVC万无一失的验证要求IfFalse错误地返回错误

  14. 14

    Maven-万无一失。如何调整报表的详细程度?

  15. 15

    使用JUnit平台 - 神火提供商的Java 9模块Maven的万无一失,插件

  16. 16

    在CentOS上设置主机名和域的万无一失/正确的方法是什么

  17. 17

    使用万无一失和requiredif来验证字符串字段

  18. 18

    有没有一种万无一失的方法来给系统足够的时间在运行copytree之前删除文件夹

  19. 19

    一种万无一失的方法来检测是否启用了开发人员选项?

  20. 20

    有没有一种万无一失的方法来检测我的声卡是否支持5.1环绕声?

  21. 21

    是否有一种简单的万无一失的方法来将命令从Ubuntu转换为Debian,反之亦然?

  22. 22

    是否有一种万无一失的简便方法来确定哪些debs意味着ubuntu将在debian上安装

  23. 23

    在 Win10 中,是否有一种万无一失的方法来发现哪个应用程序正在显示给定的弹出窗口?

  24. 24

    无法加载的魔力 '测试' - org.apache.maven.plugins:Maven的万无一失,插件:3.0.0-M1:测试

  25. 25

    空无一物

  26. 26

    分叉服务一启动就重启?

  27. 27

    LiveConnectClient | DownloadAsync崩溃无一例外

  28. 28

    以空无一人的身份运行Chromium

  29. 29

    Laravel 4崩溃无一例外

热门标签

归档