【问题标题】:Is it possible to stop fork failure here是否可以在这里停止分叉失败
【发布时间】:2019-07-31 23:34:09
【问题描述】:

我收到了这段代码,并被告知要运行它。经过一番研究,我认为这是fork炸弹,最终这里会出现fork failed。

根据手册页中的[EAGAIN] x2 和[ENOMEM],我认为这主要是由于与内存有关的原因。

但是,我有一个问题,如果

a) 可以使此代码在 LINUX 上不会出现 fork 失败

b)从理论上讲,我可以对操作系统做些什么来使 fork 失败停止,同时仍然保留 fork() 的语义。

我目前对这个问题的回答可能是找到一种方法来回收 pid 以允许无限内存,但我不确定我的答案。谁能帮帮我?

#include <unistd.h>
#include <stdio.h>
#define D 10000

double delay(unsigned long loops) 
{
    unsigned long i;
    double z = i, y;

    z = i;
    for (i = loops; i >= 1 ; i--) {
        y = ((double) loops)/((double) (loops - i + 1));
        z = (y*y + z)*i/((double) loops);
    }
    return z;
}

int main(int argc, char *argv[])
{
    int child;

    while (1) {
        if ((child=fork()) > 0)
            fprintf(stderr, "[%d] ", getpid());
        else if (child == -1)
            fprintf(stderr, "FAIL ");
        else delay(D); // Pick some large D to start with
    }
}

【问题讨论】:

  • delay 函数还有一些其他问题,因为 i 未初始化使用。
  • 我不明白这个问题。听起来您正在寻求一种方法来分叉无限数量的进程。由于一个进程需要一些内存,而您的系统的内存量是有限的,这从根本上是不可能的。
  • OT:关于:int main(int argc, char *argv[])main()的参数不打算使用时,则使用签名:int main( void )
  • 函数中:delay(),变量i未初始化使用。编译时,始终启用警告,然后修复这些警告。 (对于gcc,至少使用:-Wall -Wextra -Wconversion -pedantic -std-gnu11)注意:其他编译器使用不同的选项来产生相同的东西
  • OT: about: double z = i, y; z = i; 这是试图从(未初始化的)整数变量 i 初始化双精度变量 z。建议 1) 将 i 初始化为某个已知值 2) 只执行一次 3) 避免编译器发出有关从 intdouble 的隐式转换的警告(至少)将 i 转换为 double

标签: c operating-system fork system-calls


【解决方案1】:

大多数系统对可以创建的子进程的数量都有限制。这些是系统范围的限制或每个用户的限制。如果你在无限循环中分叉,你很可能会达到这样的限制。

在 Linux 上,你需要检查 ulimit 命令。

【讨论】:

  • 请问在LINUX中设置ulimit是否会立即终止程序?我从这个问题中了解到的是,他们希望我让程序无限期地运行,是否有可能。另外,我认为您没有回答有关代码方面的问题。
  • ulimit 告诉你极限是什么。
  • 限制不是强制你的程序去终止吗?
  • 当您对fork() 的调用失败时,程序不会清理并退出,因此即使对fork() 的调用失败,程序也会继续运行。尝试在所有孩子和父母中 fork()
  • 为什么教练会告诉你运行这样的程序?它的有效作用是将其他人锁定在计算机之外
猜你喜欢
  • 2011-10-04
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
  • 1970-01-01
  • 2022-12-06
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
相关资源
最近更新 更多