2009-04-12 71 views
2

我想测试是否使用乘法进程我可以在32位O.S上使用超过4GB的RAM(我的Ubuntu:1GB RAM)。当操作系统杀死你的进程时返回代码

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

事情是,我怀疑O.S杀死了其中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); 
} 

回答

4

的方法返回状态(如由waitwaitpidsystem返回)包含更多或更少的以下内容:

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

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

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

5

什么信号被用来杀死进程? 0和127之间

退出代码,包容,可自由地使用,并且上述128码指示该过程是由一个信号,其中,所述退出代码是

+使用

128的信号的数目终止

+0

......希望我能给予好评的意见:) – 2009-04-12 21:40:33

5

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

+0

并非完全如此。 Linux会让进程过度分配内存,然后在实际使用内存过多时终止进程。 – 2009-04-12 22:13:12

+0

有趣的是,这是我听到的第一个... – 2009-04-13 00:43:45

+0

但这仍然是猜测,唯一的方法是使用像Hasturkun提到的等待系统调用之一,并检查状态以及返回代码。 – lothar 2009-04-13 00:47:55

1

您是否检查过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 
} 
1

退出代码仅仅是“有效的” WIFEXITED宏计算结果为真时。man waitpid(2)

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

3

这段代码演示了如何让孩子的终止状态:

#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; 
} 
相关问题