Programación General > C/C++

 Probelma froks y memoria compartida (linux)

(1/2) > >>

daniels13ca:
Estoy haciendo un programa q utiliza forks y memoria compartida en c++ (linux), el codigo es el siguiente:


--- Código: C++ ---#include <iostream>#include <fstream>#include <string>#include <time.h>#include <cstdlib>#include <string.h>#include <sys/shm.h>#include <unistd.h>  using namespace std; int **matriz_in;double **matriz_out;bool **matriz_verif;int limites[4][9];bool *ya;  key_t ClaveOut;int idMemoriaOut; key_t ClaveIn;int idMemoriaIn; key_t ClaveVerif;int idMemoriaVerif; key_t ClaveYa;int idMemoriaYa;  void inicializar_verif(){    for(int i=0; i<340; i++){        for(int j=0; j<480; j++){            matriz_verif[i][j]= false;        }    }} void cargar_datos(){   ifstream entrada;   entrada.open("matriz.txt");   if (!entrada){      cerr<<"Error al abrir el archivo";   }   char buffer[1500];   for(int i=0;i<340;i++){         entrada.getline(buffer, 1500);         char *num= strtok(buffer, " ");         matriz_in[i][0]= atoi(num);         for(int j=1; j<480; j++){            num = strtok(NULL, " ");            matriz_in[i][j]= atoi(num);         }   }   entrada.close();}  void aplicar_filtro(int ini_x, int fin_x, int ini_y, int fin_y ){     int contador_i =1 ;        int contador_j =1 ;         for(int i=ini_x;i<fin_x;i++){            for(int j=ini_y; j<fin_y; j++){                if(matriz_verif[i][j]==false){                    if(contador_i==2 && contador_j==2){                        matriz_out[i][j]= matriz_in[i][j] * 0;                    }else{                        matriz_out[i][j]= matriz_in[i][j] * 0.125;                    }                    matriz_verif[i][j]=true;               }                contador_j++;                if(contador_j==4) contador_j=1;            }            contador_i++;            if(contador_i==4) contador_i=1;        } }  void guardar_datos(){    ofstream salida("matriz_transformada.txt", ios::app);    for(int i=170; i<340; i++){        for(int j=0; j<480; j++){            salida<<matriz_out[i][j]<<" ";        }    salida<<"n";    }    salida.close(); } void asignar_limites(){    limites[0][0]=170;    limites[0][1]=228;    limites[0][2]=0;    limites[0][3]=162;    limites[1][0]=170;    limites[1][1]=228;    limites[1][2]=160;    limites[1][3]=322;    limites[2][0]=170;    limites[2][1]=228;    limites[2][2]=320;    limites[2][3]=480;    limites[3][0]=226;    limites[3][1]=284;    limites[3][2]=0;    limites[3][3]=162;    limites[4][0]=226;    limites[4][1]=284;    limites[4][2]=160;    limites[4][3]=322;    limites[5][0]=226;    limites[5][1]=284;    limites[5][2]=320;    limites[5][3]=480;    limites[6][0]=282;    limites[6][1]=340;    limites[6][2]=0;    limites[6][3]=162;    limites[7][0]=282;    limites[7][1]=340;    limites[7][2]=160;    limites[7][3]=322;    limites[8][0]=282;    limites[8][1]=340;    limites[8][2]=320;    limites[8][3]=480;} int main(){  ClaveOut = ftok("/bin/more",59);    if(ClaveOut==-1){        cout<<"No consigo clave para memoria compartida OUT"<<endl;        exit(0);    }     ClaveIn = ftok("/bin/lsmod",69);    if(ClaveIn==-1){        cout<<"No consigo clave para memoria compartida IN"<<endl;        exit(0);    }      ClaveVerif = ftok("/bin/ls",3);    if(ClaveVerif==-1){        cout<<"No consigo clave para memoria compartida VERIF"<<endl;        exit(0);    }     idMemoriaOut=shmget (ClaveOut, sizeof(double)*340*480, 0777 | IPC_CREAT);    if(idMemoriaOut==-1){        cout<<"No consigo clave para memoria compartida OUT1"<<endl;        exit(0);    }      idMemoriaIn=shmget (ClaveIn, sizeof(int)*340*480, 0777 | IPC_CREAT);    if(idMemoriaIn==-1){       cout<<"No consigo clave para memoria compartida IN1"<<endl;       exit(0);    }      idMemoriaVerif=shmget (ClaveVerif, sizeof(bool)*340*480, 0777 | IPC_CREAT);    if(idMemoriaVerif==-1){       cout<<"No consigo clave para memoria compartida VERIF1"<<endl;       exit(0);    }     matriz_in = (int**)shmat (idMemoriaIn, (char*)0,0);    if(matriz_in ==NULL ){        cout<<"No se consiguio memoria compartida"<<endl;        exit(0);    }     matriz_out = (double**)shmat (idMemoriaOut, (char*)0,0);    if(matriz_out ==NULL ){        cout<<"No se consiguio memoria compartida"<<endl;        exit(0);    }     matriz_verif = (bool**)shmat (idMemoriaVerif, (char*)0,0);    if(matriz_verif ==NULL ){        cout<<"No se consiguio memoria compartida"<<endl;        exit(0);    }     matriz_in = new int * [340];    for (int i=0; i<340; i++)        matriz_in[i] = new int [480];     matriz_out = new double * [340];    for (int i=0; i<340; i++)        matriz_out[i] = new double [480];     matriz_verif = new bool* [340];    for (int i=0; i<340; i++)        matriz_verif[i] = new bool [480];     time_t start,end;    double dif;    pid_t pid[9];    time (&start);    asignar_limites();    inicializar_verif();    cargar_datos();    for(int i=0;i<9; i++){        pid[i] =fork();        if(pid[i]==0){            aplicar_filtro(limites[i][0], limites[i][1], limites[i][2], limites[i][3] );            //exit(2);            cout<<pid[i];            guardar_datos();        }        else if(pid<0){            cerr << "Failed to fork" << endl;            exit(1);        }        else {            cout<<pid[i];            time (&end);             dif = difftime (end,start);            cout<<"El tiempo es "<<dif<<" segundos"<<endl;             shmdt ((double **)matriz_out);            shmctl (idMemoriaOut, IPC_RMID, (struct shmid_ds *)NULL);             shmdt ((int **)matriz_in);            shmctl (idMemoriaIn, IPC_RMID, (struct shmid_ds *)NULL);             shmdt ((bool **)matriz_verif);            shmctl (idMemoriaIn, IPC_RMID, (struct shmid_ds *)NULL);           }         return 0;    }} 
El problema es q me guarda unicamente ceros, en lugar d elos numeros corrspondientes (la funcion de cargar_datos() y aplicar_filtro() funcionan correctamente), supongo q el error se debe a memoria compartida o forks, si alguien me puede ayudar le agradezco de antemano

m0skit0:
Usa las etiquetas de código y a lo mejor me molesto en leerlo.

daniels13ca:

--- Cita de: "m0skit0" ---Usa las etiquetas de código y a lo mejor me molesto en leerlo.
--- Fin de la cita ---
ya, gracias

daniels13ca:
ya lo solucione:

--- Código: C++ --- #include <iostream>#include <fstream>#include <string>#include <cstdlib>#include <string.h>#include <sys/shm.h>#include <unistd.h>#include <sys/timeb.h>  using namespace std;  struct matrices{    int matriz_in[340][480];    double matriz_out[340][480];    bool matriz_verif[340][480];};  int limites[4][9];    void inicializar_verif(matrices *datos){    for(int i=0; i<340; i++){        for(int j=0; j<480; j++){            datos->matriz_verif[i][j]= false;        }    }} void cargar_datos(matrices *datos){   ifstream entrada;   entrada.open("matriz.txt");   if (!entrada){      cerr<<"Error al abrir el archivo";   }   char buffer[1500];   for(int i=0;i<340;i++){         entrada.getline(buffer, 1500);         char *num= strtok(buffer, " ");         datos->matriz_in[i][0]= atoi(num);         for(int j=1; j<480; j++){            num = strtok(NULL, " ");            datos->matriz_in[i][j]= atoi(num);         }   }   entrada.close();}  void aplicar_filtro(int ini_x, int fin_x, int ini_y, int fin_y, matrices *datos ){     int contador_i =1 ;        int contador_j =1 ;         for(int i=ini_x;i<fin_x;i++){            for(int j=ini_y; j<fin_y; j++){                if(datos->matriz_verif[i][j]==false){                    if(contador_i==2 && contador_j==2){                        datos->matriz_out[i][j]= datos->matriz_in[i][j] * 0;                    }else{                        datos->matriz_out[i][j]= datos->matriz_in[i][j] * 0.125;                    }                    datos->matriz_verif[i][j]=true;               }                contador_j++;                if(contador_j==4) contador_j=1;            }            contador_i++;            if(contador_i==4) contador_i=1;        } }  void guardar_datos(matrices *datos){    ofstream salida("matriz_transformada.txt", ios::app);    for(int i=170; i<340; i++){        for(int j=0; j<480; j++){            salida<<datos->matriz_out[i][j]<<" ";        }    salida<<"n";     }    salida.close(); } void asignar_limites(){    limites[0][0]=170;    limites[0][1]=228;    limites[0][2]=0;    limites[0][3]=162;    limites[1][0]=170;    limites[1][1]=228;    limites[1][2]=160;    limites[1][3]=322;    limites[2][0]=170;    limites[2][1]=228;    limites[2][2]=320;    limites[2][3]=480;    limites[3][0]=226;    limites[3][1]=284;    limites[3][2]=0;    limites[3][3]=162;    limites[4][0]=226;    limites[4][1]=284;    limites[4][2]=160;    limites[4][3]=322;    limites[5][0]=226;    limites[5][1]=284;    limites[5][2]=320;    limites[5][3]=480;    limites[6][0]=282;    limites[6][1]=340;    limites[6][2]=0;    limites[6][3]=162;    limites[7][0]=282;    limites[7][1]=340;    limites[7][2]=160;    limites[7][3]=322;    limites[8][0]=282;    limites[8][1]=340;    limites[8][2]=320;    limites[8][3]=480;} int main(){           struct timeb ini;     struct timeb fin;     pid_t pid;     int idMemoria;    matrices * apt;    void * memoria;     idMemoria = shmget((key_t)4322, sizeof (matrices), 0666 | IPC_CREAT);    if (idMemoria == -1)    {        cout << "No consigo clave para memoria compartida" << endl;        exit(0);    }     memoria = (int *) shmat(idMemoria, (void *) 0, 0);    if (memoria == (void *) -1)    {        cout << "No se consiguio memoria compartida" << endl;        exit(-1);    }     apt = (matrices *) memoria;     ftime(&ini);    asignar_limites();    inicializar_verif(apt);    cargar_datos(apt);    for(int i=0;i<9; i++){        pid =fork();        if(pid<0){            cout<<"fork failed";            exit(-1);        }        if(pid==0){            aplicar_filtro(limites[i][0], limites[i][1], limites[i][2], limites[i][3], apt);            return 0;        }    }    ftime(&fin);     cout<<"El tiempo es "<<fin.millitm - ini.millitm<<" milisegundos"<<endl;     //sleep(5);    guardar_datos(apt);    return 0;} 

m0skit0:
Gracias por postear la solución  :good: . Al final no tuve tiempo para mirarlo, disculpa.

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa