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

Lir*_*evi 2 linux memory-management kill process return-value

我想测试一下,如果使用多重进程,我可以在32位操作系统上使用超过4GB的内存(我的:Ubuntu,1GB内存).

所以我编写了一个小程序,mallocs略小于1GB,并对该阵列执行一些操作,并运行该程序的5个实例查询分叉.

问题是,我怀疑操作系统杀死了其中的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);
}
Run Code Online (Sandbox Code Playgroud)

Mih*_*șan 5

什么信号被用来杀死进程?

0到127之间的退出代码(包括0和127)可以自由使用,128以上的代码表示进程被信号终止,退出代码为

128 +所用信号的数量


Dav*_*d Z 5

好吧,如果你的进程无法malloc()获得1GB内存,操作系统不会终止进程.发生的一切都是malloc()返回NULL.因此,根据您编写代码的方式,过程可能会返回0 - 如果您希望在内存分配失败时返回错误代码(这通常是一种很好的做法),您必须将该行为编入它.