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

标签 linux memory-management process return-value kill

我想测试我是否能够在 32 位操作系统(我的:Ubuntu 和 1GB 内存)上使用超过 4GB 的内存。

所以我编写了一个小程序,它 malloc 的内存略少于 1GB,并对那个数组执行了一些操作,并运行了这个程序的 5 个实例 vie forks。

问题是,我怀疑 O.S 杀死了其中的 4 个,只有一个幸存下来并显示它是“PID:我已经完成了”)。

(我用小数组试过,打印了 5 次,当我用 TOP 查看正在运行的进程时,我也只看到一个实例..)

奇怪的是 - 我在所有实例中都收到了返回码 0(成功?),包括据称被操作系统杀死的实例。

我没有收到任何说明进程已被终止的信息。

对于这种情况,此返回码是否正常?

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

谢谢。

编辑:一些答案表明小程序中可能存在错误,所以在这里。 fork 和保存返回码的较大程序较大,我无法在此处上传它,但我认为(并希望)它很好。

我还注意到,如果我不使用我的 fork 程序运行它,而是使用终端运行它 './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);
}

最佳答案

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

关于linux - 当操作系统终止您的进程时返回代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/742413/

相关文章:

linux - 如何使用 emacs 访问 Windows 共享文件夹

java - 使用 JNA 相对于流程执行的优势

linux - Electron :linux start at boot up system

java - 如何计算(并指定)java进程允许的总内存空间?

c# - 在 C# 中释放 C 分配的内存

c++ - 如何确保 `waitpid(-1, &stat, WNOHANG)` 收集所有子进程

ruby - 为什么 Process.setsid 在 ruby​​ 中需要 root 权限?

c - 如何避免重新定义 VERSION、PACKAGE 等

java - Java中,空的HashMap空间分配

windows - 为什么这个 Perl 脚本在 60 秒后不退出或死掉?