【问题标题】:OS X Kills processes that fork too quickly?OS X 杀死分叉太快的进程?
【发布时间】:2016-06-30 02:26:36
【问题描述】:

我是操作系统课程的助教,学生的任务是开发fork bomb 解毒器。作为测试用例的一部分,我想开发一些看起来像叉子炸弹但实际上相当安全的东西(即产生许多进程,但这些进程被删除了)。我的问题是,在我的 OS X 机器上进行测试时,我注意到如果我将睡眠延迟设置得太低(~100000)和孩子的数量太高(~1000),它实际上会杀死我所有的用户进程。当我说的都是 Firefox、Xcode、Word,甚至 Finder 似乎都在下降。这对我来说似乎有些奇怪,因为该任务只有一个孩子,但我想知道 OS X 是否对用户可以拥有的子进程数量有限制。我无法在谷歌上找到任何东西,但欢迎提出任何建议。

特别是: 1)这段代码是否不合理,我错过了一些应该被杀死的明显原因? 2) OS X 中是否有一些文档可以解释我们看到这种行为的原因?

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    int i;
    pid_t pid;

    if(argc < 2) {
        printf("Usage: fork_safe n\n");
        return 0;
    }

    int n = strtol(argv[1], NULL, 10);

    for(i = 0; i < n; i++) {
        pid = fork();
        if(pid == 0){
            break;
        } else {
            printf("child pid %d, killing...\n", pid);
            usleep(10000);
            kill(pid,SIGTERM);
            fflush(stdout);
        }
    }

    while(1);
    return 0;
}

【问题讨论】:

标签: macos operating-system fork osx-elcapitan


【解决方案1】:

您没有检查来自fork() 的返回值是否有错误。如果它返回-1,则您将-1 传递给kill 函数。

并根据man page for the kill function

如果 pid 等于 -1,则 sig 被发送到每个进程 调用进程有权限发送信号,除了进程1 (init),但见下文。

所以我怀疑fork 在无法分配更多进程时会失败。因此,您的代码正在向您帐户拥有的每个进程发送一个 SIGTERM。这解释了您所看到的行为。

相应地修改你的 for 循环:

for(i = 0; i < n; i++)
{
    pid = fork();
    if(pid == 0)
    {
        break;
    }
    else if (pid == -1)
    {
        printf("Unable to allocate any more processes\n");
        return 0;
    }
    else
    {
        printf("child pid %d, killing...\n", pid);
        usleep(10000);
        kill(pid,SIGTERM);
        fflush(stdout);
    }
}

【讨论】:

  • 天哪,真不敢相信我没有想到这一点,感谢您的快速回复!似乎 fork 正在返回-1,并补充说 catch 似乎已经解决了这个问题。此外,“ulimit -u”显示 709,接近我得到的 613。谢谢!
猜你喜欢
  • 2012-03-22
  • 1970-01-01
  • 2019-06-14
  • 2018-01-23
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 2013-10-31
  • 1970-01-01
相关资源
最近更新 更多