我想测试是否通过多个进程我能够在 32 位操作系统上使用超过 4GB 的内存(我的:带有 1GB 内存的 Ubuntu)。
因此,我编写了一个 malloc 略小于 1GB 的小程序,并对该数组执行了一些操作,并运行了该程序的 5 个实例 vie forks。
问题是,我怀疑操作系统杀死了其中的 4 个,只有一个幸存下来并显示它是“PID:我已经完成”)。
(我用小数组尝试过,打印了 5 次,当我用 TOP 查看正在运行的进程时,我只看到一个实例..)
奇怪的是 - 我在所有实例中都收到了返回代码 0(成功?),包括那些据称被操作系统杀死的实例
我没有得到任何说明进程被杀死的消息。
这个返回码在这种情况下正常吗?
(如果是这样,它会降低我对“返回码”的信任......)
谢谢。
编辑:一些答案暗示了小程序中可能存在的错误,所以在这里。分叉和保存返回码的较大程序较大,我无法在这里上传它,但我认为(并希望)它很好。
我还注意到,如果不是使用我的分叉程序运行它,而是使用终端运行它,使用 './a.out & ./a.out & ./a.out & ./a.out &' (当./a.out 是附加的小程序的二进制文件)我确实看到了一些“Killed”消息。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#define SMALL_SIZE 10000
#define BIG_SIZE 1000000000
#define SIZE BIG_SIZE
#define REAPETS 1
int
main()
{
pid_t my_pid = getpid();
char * x = malloc(SIZE*sizeof(char));
if (x == NULL)
{
printf("Malloc failed!");
return(EXIT_FAILURE);
}
int x2=0;
for(x2=0;x2<REAPETS;++x2)
{
int y;
for(y=0;y<SIZE;++y)
x[y] = (y+my_pid)%256;
}
printf("%d: I'm over.\n",my_pid);
return(EXIT_SUCCESS);
}