c - C语言程序执行,终端显示: Finished (killed)

标签 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;
}

最佳答案

您几乎可以肯定缺少交换 分区,或者您有一些其他实用程序监视可用空闲内存 的数量,因此您的程序被终止 em> 因为它消耗太多内存,以至于没有可用的 ram 了。

您可以使用htopconky 来清楚地了解问题。


如果您有一个交换分区,那么您的系统将尝试从磁盘交换内存,这很可能卡住 它。这是一个更糟糕的情况,因为在大多数情况下,您可以采取的使系统恢复工作的唯一操作是重新启动:根据我的经验,当系统卡住时,它不再响应任何键盘输入。


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


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

关于c - C语言程序执行,终端显示: Finished (killed),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38827350/

相关文章:

git - 在终端 SSH 中获取当前路径的 url

c - C中的二进制数据到整数

c - Linux 内核源代码中定义的 TTL(生存时间)值在哪里?

c - KDevelop4:加载共享库时出错

c - 如何在 C 中使用函数(初学者)

linux - 应用程序试图创建一个窗口,但无法加载驱动程序

linux - 无法配置数据记录系统

windows - 如何在 mac 中拆分文件然后将其连接到 Windows(例如 : using split and cat)?

c - 如何安装信号处理程序名称 sig_handler

c - 是否可以在单个 C 程序中在多个终端窗口上输出?