【问题标题】:What might be possible reasons that I get "Cannot Allocate Memory" error on forking()?在 forking() 上出现“无法分配内存”错误的可能原因是什么?
【发布时间】:2011-11-07 01:11:20
【问题描述】:

我正在用 C 语言创建一个简单的 Unix shell。我使用 fork() 来克隆进程并使用 exec 来执行一个新的。当您第一次在 shell 中输入数据时,它工作正常。但是当第二次迭代时,fork 返回 -1。

例如

...>ls -l /

/结果在这里/

...>ls -l /

分叉失败

这是部分代码:

int execute(char path[80],char *args[]){
pid_t pid;
if((pid=fork())<0){
 printf("forking failed"); // The forking failed due to Cannot allocate memory error
 exit(0);
}else if(pid==0){
 execv(path,args);
}else{
 wait(NULL);
}
return 0
}

其中路径为“bin/ls”,参数为“ls”,NULL

主要是看起来像

int main(){
 while(1){
 //read from keyboard
 //find the program path
 //fill args
 execute(path,args);
 }
}

【问题讨论】:

  • 查阅 errno 和 fork(2) 手册页。这不属于这里。
  • ls 命令通常是内置的,但您的问题暗示它是您编写的导致问题的 c 程序。澄清一下?
  • 我已经咨询过了。@tchrist

标签: c shell unix fork


【解决方案1】:

将您的第一个 if 分支更改为:

if((pid=fork())<0){
 perror("forking failed");
 exit(0);
}

这会告诉你出了什么问题。

【讨论】:

  • 我做到了,错误是:无法分配内存。任何想法为什么会发生这种情况?
  • 我猜你的机器内存不足。
  • 它的发生是因为它说它发生的原因。
  • 我的猜测是您的第一个 execv 失败并且孩子处于 fork 炸弹中的 while 循环中。检查第一个execv是否成功。
  • @JustCurious 您可能应该检查execv 的返回值以确定,但它确实听起来像它的工作。另一方面,bin/ls 可能不代表可执行文件,除非您当前的工作目录是 /
猜你喜欢
  • 2021-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-23
  • 2016-05-10
  • 2013-06-25
  • 1970-01-01
  • 2021-06-25
相关资源
最近更新 更多