执行C程序,终端显示:已完成(已杀死)

时间:2016-08-08 10:54:07

标签: c linux terminal

我在Linux中从终端运行C程序,我收到消息“已完成(已杀死)”。从获得的输出中我看到执行或多或少总是在同一点被杀死。我也在处理大量数据,我正在计算机本地执行该程序。

在控制台中写入ulimit -a我得到以下信息:

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 29117
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 29117
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

但我看到正常值。

我不知道该做什么才能完成整个执行。我已经优化了代码并释放了内存,但我得到了同样的问题“(已杀)”。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

#define T 100
#define dt 1.e-4
#define itmax (T/dt)

#define a 0.27

#define K1 0.15
#define K2 1.e2
#define pp 1.e3
#define s 2

#define TWOPI (6.2831853071795864769252867665590057683943387987502)
#define IM1 2147483563
#define IM2 2147483399
#define AM (1.0/IM1)
#define IMM1 (IM1-1)
#define IA1 40014
#define IA2 40692
#define IQ1 53668
#define IQ2 52774
#define IR1 12211
#define IR2 3791
#define NTAB 32
#define NDIV (1+IMM1/NTAB)
#define EPS 1.2e-7
#define RNMX (1.0-EPS)

double ran2(double *idum){
  int j;
  long k;
  static long idum2=123456789;
  static long iy=0;
  static long iv[NTAB];
  float temp;

  if (*idum <= 0) {
    if (-(*idum) < 1) *idum=1;
    else *idum = -(*idum);
    idum2=(*idum);
    for (j=NTAB+7;j>=0;j--) {
      k=(*idum)/IQ1;
      *idum=IA1*(*idum-k*IQ1)-k*IR1;
      if (*idum < 0) *idum += IM1;
      if (j < NTAB) iv[j] = *idum;
    }
    iy=iv[0];
  }
  k=(*idum)/IQ1;
  *idum=IA1*(*idum-k*IQ1)-k*IR1;
  if (*idum < 0) *idum += IM1;
  k=idum2/IQ2;
  idum2=IA2*(idum2-k*IQ2)-k*IR2;
  if (idum2 < 0) idum2 += IM2;
  j=iy/NDIV;
  iy=iv[j]-idum2;
  iv[j] = *idum;
  if (iy < 1) iy += IMM1;
  if ((temp=AM*iy) > RNMX) return RNMX;
  else return temp;
}

double RANDN(double seed){
  return sqrt(-2.0*log(ran2(&seed)))*cos(TWOPI*ran2(&seed));
}

double rnd(){
  return (double) rand() / (double) RAND_MAX;
}

int main(){
  int j, rows, d;
  d=0;
  double *t;
  t=(double *) malloc((itmax)*sizeof(double)); 

  double **x, **y;
  x=(double **)malloc(2*sizeof(double*));
  y=(double **)malloc(2*sizeof(double*));

  for(rows=0; rows<2; rows++){
    x[rows]=(double*)malloc(itmax*sizeof(double));
    y[rows]=(double*)malloc(itmax*sizeof(double));
  }

  double p, L, C, bC, Qx, Qy;
  double bx, by Qbx, Qby, KK, KKK, dt2;

  srand(time(NULL));

  t[0]=0;
  for(rows=0; rows<2; rows++){
    x[rows][0]=10+rows*i;
    y[rows][0]=1300;
  } 

  L=s*0.0001;

  KK=K1*K1;
  KKK=K2*K2;
  dt2=0.5*dt;
  C=KK*KKK;
  bC=a*C;
  for(j=0; j<=itmax; j++){
    p=pp-x[0][j]+x[1][j];

    Qx=a+bC/(KK+C)-a*x[0][j]*y[0][j];
    Qy=y[1][j]-y[0][j];

    bx=x[0][j]+dt*Qx+L*RANDN(rnd()+2);
    by=y[0][j]+dt*Qy+L*RANDN(rnd()+2);

    Qbx=a+bC/(KK+C)-a*bx*by-a*bx;
    Qby=y[0][j]-y[1][j];;

    x[0][j+1]=(bx+x[0][j])/2+(Qbx+Qx)*2;
    y[0][j+1]=(by+y[0][j])/2+(Qby+Qy)*2;

    Qx=a+bC/KK-a*x[1][j]*y[1][j];
    Qy=y[1][j];

    bx=x[1][j]+dt*Qx;
    by=y[1][j]+dt*Qy;

    Qbx=a+C/(KK+C)-a*bx*by-a*bx;
    Qby=by*(y[1][j]-y[0][j]);

    x[1][j+1]=(bx+x[1][j])/2+(Qbx+Qx)*dt2+L*RANDN(rnd()+2);
    y[1][j+1]=(by+y[1][j])/2+(Qby+Qy)*dt2+L*RANDN(rnd()+2);

    if(j==d){
      d+=T;
      printf("%G %G %G %G %G\n",t[j],x[0][j],x[1][j],y[0][j],y[1][j]);
    }
  }
  return 0;
}

2 个答案:

答案 0 :(得分:3)

您几乎肯定缺少 swap 分区,或者您有一些其他实用程序监视可用可用内存的数量,因此您的程序已杀死因为消耗太多内存,直到没有免费的 ram 为止。

您可以使用 htop conky 清楚地查看问题。

如果你有一个 swap 分区,那么你的系统会尝试从/向磁盘交换内存,这很可能冻结重启:根据我的经验,当系统冻结时它不再响应任何键盘输入。

在我的系统上,您的可执行文件需要 2m26s 来填充 50% 8GB RAM ,不计算其他正在运行的程序占用的额外 32%

您可能希望使用内存泄漏分析工具(例如 valgrind )来检查潜在的泄漏,或者只是手动检查源代码。如果你不能减少它的内存占用,那么你唯一的选择是寻找一个功能更强大的机器,它有一个更大的 RAM 池。

答案 1 :(得分:2)

使用-g编译并链接调试信息,然后在gdb等调试器的控制下运行程序,并观察它停止的位置。您应该看到哪一行源代码会导致系统杀死您的程序的问题。

$ gcc -O2 -g -o my_program my_program.c
$ gdb my_program
gdb> run

如果您的程序需要命令行参数,请在run命令

上键入它们
gdb> run arg1 arg2