【发布时间】: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) 避免编译器发出有关从int到double的隐式转换的警告(至少)将i转换为double
标签: c operating-system fork system-calls