一尘不染

当操作系统终止您的进程时返回代码

linux

我想测试在32位操作系统上是否可以通过乘法进程使用超过4GB的内存(我的:具有1GB内存的Ubuntu)。

因此,我编写了一个小程序,该程序的malloc小于1GB,并对该数组进行了一些操作,并运行了该程序的5个实例。

事实是,我怀疑OS杀死了其中的4个,只有一个幸存下来并显示为“ PID:我完成了”。

(我已经尝试过使用小型阵列并进行5次打印,而且当我使用TOP查看正在运行的进程时,我只看到一个实例。)

奇怪的是-我在所有实例中都收到了返回代码0(成功?),包括那些据称被OS杀死的实例

我没有得到任何按摩说明进程被杀死了。

在这种情况下,此返回码正常吗?

(如果是这样,则会降低我对“返回码”的信任…)

谢谢。

编辑:一些答案表明小程序可能存在错误,所以就在这里。派生并保存返回代码的较大程序较大,在这里将其上载时遇到了麻烦,但我认为(并希望)很好。

我还注意到,如果不是使用分叉程序运行它,而是使用’./a.out&./a.out&./a.out&./a.out&’(当./a.out是附带的小程序的二进制文件),我确实看到了一些“杀手”消息。

#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);
}

阅读 305

收藏
2020-06-07

共1个答案

一尘不染

的方法返回状态(如通过返回waitwaitpidsystem)含有更多或更少的情况如下:

  • 退出代码,仅在进程正常终止时适用
  • 是否发生正常/异常终止
  • 终止信号,仅在过程被信号终止时适用

如果您的进程被OOM杀手杀死(显然会向您发送SIGKILL信号),则退出代码完全没有意义。

有关更多信息,请参见等待命令的手册页。

2020-06-07