当操作系统杀死你的进程时返回代码

我想testing如果使用多进程,我可以在32位操作系统上使用超过4GB的内存(我的是:1GB内存的Ubuntu)。

所以我写了一个malloc稍小于1GB的小程序,并对该数组执行一些操作,并运行该程序的5个实例。

事情是,我怀疑操作系统杀死了其中的4个,只有一个幸存下来,并显示它是“PID:我已经完成”)。

(我已经尝试了小数组,并得到5印刷,当我看着与TOP运行的进程,我只看到一个实例..)

奇怪的是这个 – 我收到了所有实例的返回代码0(成功?),包括据说被OS

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

这个返回代码是否正常?

(如果是这样,这减less了我对'返回代码'的信任…)

谢谢。

编辑:一些答案build议在小程序可能的错误,所以在这里。 分支和保存返回码的较大的程序是较大的,我在这里有麻烦,但我认为(并希望)没有问题。

我也注意到,如果不是用我的分叉程序来运行它,我使用'.a.out&./a.out&./a.out&./a.out&'来运行terminal。 ./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); } 

Solutions Collecting From Web of "当操作系统杀死你的进程时返回代码"

进程的返回状态(由waitwaitpidsystem返回)包含或多或少的如下内容:

  • 退出代码只适用于进程正常结束的情况
  • 是否发生正常/异常终止
  • 终止信号仅适用于过程由信号终止的情况

如果您的进程被OOM杀手(显然会向您发送SIGKILL信号)杀死的话,退出代码是毫无意义的,

有关更多信息,请参阅wait命令的手册页。

那么,如果你的进程无法malloc() 1GB的内存,操作系统将不会杀死进程。 发生的只是malloc()返回NULL。 所以,根据你写代码的方式,这个过程有可能返回0,如果你想在内存分配失败的时候返回一个错误代码(这是一个很好的做法),你必须把这个行为编程到它。

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

可以自由使用0至127之间的退出码,并且高于128的码指示该过程由信号终止,其中退出码是

128 +使用的信号的数量

此代码显示如何获得小孩的终止状态:

 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> int main (void) { pid_t pid = fork(); if (pid == -1) { perror("fork()"); } /* parent */ else if (pid > 0) { int status; printf("Child has pid %ld\n", (long)pid); if (wait(&status) == -1) { perror("wait()"); } else { /* did the child terminate normally? */ if(WIFEXITED(status)) { printf("%ld exited with return code %d\n", (long)pid, WEXITSTATUS(status)); } /* was the child terminated by a signal? */ else if (WIFSIGNALED(status)) { printf("%ld terminated because it didn't catch signal number %d\n", (long)pid, WTERMSIG(status)); } } } /* child */ else { sleep(10); exit(0); } return 0; } 

你检查了fork()的返回值吗? 如果fork()不能为新进程的地址空间分配足够的内存,那么很可能会返回一个错误(-1)。 调用fork()一个典型方法是:

 pid_t pid; switch(pid = fork()) { case 0: // I'm the child process break; case -1: // Error -- check errno fprintf(stderr, "fork: %s\n", strerror(errno)); break; default: // I'm the parent process } 

当WIFEXITED宏评估为真时,退出代码仅为“有效”。 见男人waitpid(2) 。

您可以使用WIFSIGNALED宏来查看您的程序是否已被发送信号。