如何解决forkbomb,没有子进程,资源暂时不可用需要等待函数
我有一个程序可以在任何在线 c 编译器中完美运行,但是当我把它放在我大学的服务器上时,它填满了这个错误,我必须让系统管理员停止这个过程,因为我没有权限到。两次很尴尬,我做不到三次。这是错误
-bash: fork: retry: No child processes
-bash: fork: retry: No child processes
-bash: fork: retry: No child processes
-bash: fork: retry: No child processes
-bash: fork: Resource temporarily unavailable
这是我的代码。我相信我的问题出在第 40-44 行,我应该添加一个等待,但我尝试使用 NULL 和 &x 作为等待的指针,但都没有做任何事情。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <signal.h>
#include <math.h>
#define MAXPROCESS 8
struct userProcess {
pid_t pid;
int processes[2];
};
struct userProcess numProcess[MAXPROCESS];
void fork_Function(struct userProcess *,int,float);
float parent_Function(struct userProcess *,float);
float FofX(float);
int N = 8;
int main(void) {
int x,y,i,status;
int hasPrinted = 0;
float a = 0.0;
float b = 2.0;
int n = 64;
float h = (b - a) / n;
numProcess[0].pid = getpid();
for (x = 0; x <= MAXPROCESS; x++) {
pipe(numProcess[x].processes);
numProcess[x].pid = fork();
}
// process through each function and call the fork_Function
for (i = 1; i <= N; i++) {
if (numProcess[i].pid == 0) {
fork_Function(numProcess,h);
exit(0);
}
}
double result = parent_Function(numProcess,N,h);
printf("\nThe Trapezoidal Rule Result: %f",result);
exit(0);
}
// function executed by the child process
void fork_Function(struct userProcess x[],int count,float trapBase) {
float threadIN[2],threadOUT[2] = { 0,count };
read(x[count].processes[0],threadIN,sizeof(double));
int c = 0;
while (c < N) {
threadOUT[0] = trapBase *(threadIN[0] + threadIN[1]) / 2.0;
write(x[0].processes[1],threadOUT,sizeof(double));
read(x[count].processes[0],sizeof(double));
c++;
}
}
// function executed by the parent
float parent_Function(struct userProcess x[],int N,float trapBase) {
float threadIN[2],threadOUT[2];
int y = 0;
float integral = 0;
for (y = 0; y < N; y++) {
threadOUT[0] = FofX(trapBase *(float)(y));
threadOUT[1] = FofX(trapBase *(float)(y + 1));
write(x[y + 1].processes[1],sizeof(double));
}
for (y = N; y < 64; y++) {
read(x[0].processes[0],sizeof(double));
integral += threadIN[0];
threadOUT[0] = FofX(trapBase *(float)(y));
threadOUT[1] = FofX(trapBase *(float)(y + 1));
write(x[(y % 8) + 1].processes[1],sizeof(double));
}
return integral;
}
float FofX(float x) {
return 1 / ((x * x) + 1);
}
编辑:我更新了代码以摆脱无用的 if,第二个 for 循环和 while 循环仅适用于进程数量的长度。我在一个在线编译器中运行了它,它运行得很好。但我认为我没有解决分叉问题
任何帮助将不胜感激,谢谢!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。