OS X杀死进程太快?

问题描述:

我是操作系统课程的助教,学生的任务是开发一个fork bomb defuser。作为测试案例的一部分,我想开发一种看起来像叉炸弹的东西,但事实上它相当安全(即消除了许多进程,但这些进程已被删除)。我的问题是,在我的OS X机器上进行测试时,我注意到如果将睡眠延迟设置得太低(〜100000)并且孩子数量太高(〜1000),它实际上会杀死我所有的用户进程。当我说我的意思是Firefox,Xcode,Word,甚至Finder似乎都停止了。这对我来说似乎有点奇怪,因为任务只有一个孩子,但我想知道OS X是否对用户可以拥有的子进程数量有限制。我无法在Google上找到任何内容,但有任何建议。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; 
} 
+0

这可能有助于问这个上[提出不同(http://apple.stackexchange.com/)。 –

你是不是检查从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); 
    } 
} 
+0

哎呀,真不敢相信我没有想到这一点,感谢您的快速回复!它看起来似乎是fork返回-1,并补充说catch可以解决这个问题。另外“ulimit -u”显示709,这接近我得到的613。谢谢! – Christophe