首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SIGKILL终止进程

SIGKILL终止进程
EN

Stack Overflow用户
提问于 2012-01-02 09:48:44
回答 2查看 5.5K关注 0票数 6

我有一个在执行程序后立即被杀死的进程。这是编译后的可执行文件的代码,它是一个小程序,它从标准输入(通常是一个描述性文件)中读取由数字表示的几个图,并使用Prim算法找到每个图的最小生成树(它还没有显示结果,它只是找到了解决方案)。

代码语言:javascript
复制
#include <stdlib.h>  
#include <iostream>  

using namespace std;

const int MAX_NODOS = 20000;
const int infinito = 10000;

int nnodos;
int nAristas;
int G[MAX_NODOS][MAX_NODOS]; 
int solucion[MAX_NODOS][MAX_NODOS];
int menorCoste[MAX_NODOS];
int masCercano[MAX_NODOS];



void leeGrafo(){
    if (nnodos<0 || nnodos>MAX_NODOS) {
        cerr << "Numero de nodos (" << nnodos << ") no valido\n";
        exit(0);
    }  
    for (int i=0; i<nnodos ; i++)
        for (int j=0; j<nnodos ; j++)
            G[i][j] = infinito; 
    int A,B,P;
    for(int i=0;i<nAristas;i++){
        cin >> A >> B >> P; 
        G[A][B] = P;
        G[B][A] = P;
    }   
}


void prepararEstructuras(){
    // Grafo de salida
    for(int i=0;i<nnodos;i++)
        for(int j=0;j<nnodos;j++)
            solucion[i][j] = infinito;
    // el mas cercaano 
    for(int i=1;i<nnodos;i++){
        masCercano[i]=0;
        // menor coste
        menorCoste[i]=G[0][i];
    }           
}

void prim(){
    prepararEstructuras();
    int min,k;  
    for(int i=1;i<nnodos;i++){
        min = menorCoste[1];
        k = 1;
        for(int j=2;i<nnodos;j++){
            if(menorCoste[j] < min){
                min = menorCoste[j];
                k = j;
            }
        }
        solucion[k][masCercano[k]] = G[k][masCercano[k]];
        menorCoste[k] = infinito;
        for(int j=1;j<nnodos;j++){
            if(G[k][j] < menorCoste[j] && menorCoste[j]!=infinito){
                menorCoste[j] = G[k][j];
                masCercano[j] = k;
            }       
        }           
    }
}

void output(){
    for(int i=0;i<nnodos;i++){
        for(int j=0;j<nnodos;j++)
            cout << G[i][j] << ' ';
        cout << endl;
    }
}

int main (){
    while(true){
        cin >> nnodos;
        cin >> nAristas;
        if((nnodos==0)&&(nAristas==0)) break;
        else{
            leeGrafo();
            output();
            prim(); 
        }
    }   
}

我知道我必须使用strace来找出发生了什么,这是我得到的结果:

代码语言:javascript
复制
execve("./412", ["./412"], [/* 38 vars */] <unfinished ...>
+++ killed by SIGKILL +++
Killed

我正在运行ubuntu,这是我第一次遇到这种类型的错误。程序应该在从输入中读取一行中的两个零之后停止,我可以保证在我的图形描述文件中有。此外,即使我在不对图形文件执行输入重定向的情况下执行程序,也会发生问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-02 09:54:55

尽管我不能100%确定这就是问题所在,但看看你的全局数组的大小:

代码语言:javascript
复制
const int MAX_NODOS = 20000;

int G[MAX_NODOS][MAX_NODOS]; 
int solucion[MAX_NODOS][MAX_NODOS];

假设int是4个字节,您将需要:

代码语言:javascript
复制
20000 * 20000 * 4 bytes * 2 = ~3.2 GB

首先,你甚至可能没有那么多内存。其次,如果您使用的是32位操作系统,则操作系统很可能根本不允许单个进程拥有那么多内存。

假设您使用的是64位系统(假设您有足够的内存),那么解决方案就是在运行时将其全部分配。

票数 8
EN

Stack Overflow用户

发布于 2012-01-02 09:54:29

您的数组Gsolucion分别包含400,000,000个整数,在大多数计算机上,每个整数大约为1.6 GiB。除非您有足够的(虚拟)内存(3.2 GiB和更多),并且有使用它的权限(尝试ulimit -d;这对于MacOS X 10.7.2上的bash是正确的),否则您的进程将无法启动,并将被SIGKILL终止(SIGKILL不能被捕获,而不是进程真正在运行)。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8696841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档