Programación General > C/C++
Probelma froks y memoria compartida (linux)
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
[#] Página Siguiente
Ir a la versión completa