• Sábado 9 de Noviembre de 2024, 02:24

Autor Tema:  Probelma froks y memoria compartida (linux)  (Leído 1998 veces)

daniels13ca

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Probelma froks y memoria compartida (linux)
« en: Domingo 10 de Mayo de 2009, 03:00 »
0
Estoy haciendo un programa q utiliza forks y memoria compartida en c++ (linux), el codigo es el siguiente:

Código: C++
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. #include <time.h>
  5. #include <cstdlib>
  6. #include <string.h>
  7. #include <sys/shm.h>
  8. #include <unistd.h>
  9.  
  10.  
  11. using namespace std;
  12.  
  13. int **matriz_in;
  14. double **matriz_out;
  15. bool **matriz_verif;
  16. int limites[4][9];
  17. bool *ya;
  18.  
  19.  
  20. key_t ClaveOut;
  21. int idMemoriaOut;
  22.  
  23. key_t ClaveIn;
  24. int idMemoriaIn;
  25.  
  26. key_t ClaveVerif;
  27. int idMemoriaVerif;
  28.  
  29. key_t ClaveYa;
  30. int idMemoriaYa;
  31.  
  32.  
  33. void inicializar_verif(){
  34.     for(int i=0; i<340; i++){
  35.         for(int j=0; j<480; j++){
  36.             matriz_verif[i][j]= false;
  37.         }
  38.     }
  39. }
  40.  
  41. void cargar_datos(){
  42.    ifstream entrada;
  43.    entrada.open("matriz.txt");
  44.    if (!entrada){
  45.       cerr<<"Error al abrir el archivo";
  46.    }
  47.    char buffer[1500];
  48.    for(int i=0;i<340;i++){
  49.          entrada.getline(buffer, 1500);
  50.          char *num= strtok(buffer, " ");
  51.          matriz_in[i][0]= atoi(num);
  52.          for(int j=1; j<480; j++){
  53.             num = strtok(NULL, " ");
  54.             matriz_in[i][j]= atoi(num);
  55.          }
  56.    }
  57.    entrada.close();
  58. }
  59.  
  60.  
  61. void aplicar_filtro(int ini_x, int fin_x, int ini_y, int fin_y ){
  62.  
  63.     int contador_i =1 ;
  64.         int contador_j =1 ;
  65.  
  66.         for(int i=ini_x;i<fin_x;i++){
  67.             for(int j=ini_y; j<fin_y; j++){
  68.                 if(matriz_verif[i][j]==false){
  69.                     if(contador_i==2 && contador_j==2){
  70.                         matriz_out[i][j]= matriz_in[i][j] * 0;
  71.                     }else{
  72.                         matriz_out[i][j]= matriz_in[i][j] * 0.125;
  73.                     }
  74.                     matriz_verif[i][j]=true;
  75.                }
  76.                 contador_j++;
  77.                 if(contador_j==4) contador_j=1;
  78.             }
  79.             contador_i++;
  80.             if(contador_i==4) contador_i=1;
  81.         }
  82.  }
  83.  
  84.  
  85. void guardar_datos(){
  86.     ofstream salida("matriz_transformada.txt", ios::app);
  87.     for(int i=170; i<340; i++){
  88.         for(int j=0; j<480; j++){
  89.             salida<<matriz_out[i][j]<<" ";
  90.         }
  91.     salida<<"n";
  92.     }
  93.     salida.close();
  94.  
  95. }
  96.  
  97. void asignar_limites(){
  98.     limites[0][0]=170;
  99.     limites[0][1]=228;
  100.     limites[0][2]=0;
  101.     limites[0][3]=162;
  102.     limites[1][0]=170;
  103.     limites[1][1]=228;
  104.     limites[1][2]=160;
  105.     limites[1][3]=322;
  106.     limites[2][0]=170;
  107.     limites[2][1]=228;
  108.     limites[2][2]=320;
  109.     limites[2][3]=480;
  110.     limites[3][0]=226;
  111.     limites[3][1]=284;
  112.     limites[3][2]=0;
  113.     limites[3][3]=162;
  114.     limites[4][0]=226;
  115.     limites[4][1]=284;
  116.     limites[4][2]=160;
  117.     limites[4][3]=322;
  118.     limites[5][0]=226;
  119.     limites[5][1]=284;
  120.     limites[5][2]=320;
  121.     limites[5][3]=480;
  122.     limites[6][0]=282;
  123.     limites[6][1]=340;
  124.     limites[6][2]=0;
  125.     limites[6][3]=162;
  126.     limites[7][0]=282;
  127.     limites[7][1]=340;
  128.     limites[7][2]=160;
  129.     limites[7][3]=322;
  130.     limites[8][0]=282;
  131.     limites[8][1]=340;
  132.     limites[8][2]=320;
  133.     limites[8][3]=480;
  134. }
  135.  
  136. int main()
  137. {
  138.   ClaveOut = ftok("/bin/more",59);
  139.     if(ClaveOut==-1){
  140.         cout<<"No consigo clave para memoria compartida OUT"<<endl;
  141.         exit(0);
  142.     }
  143.  
  144.     ClaveIn = ftok("/bin/lsmod",69);
  145.     if(ClaveIn==-1){
  146.         cout<<"No consigo clave para memoria compartida IN"<<endl;
  147.         exit(0);
  148.     }
  149.  
  150.  
  151.     ClaveVerif = ftok("/bin/ls",3);
  152.     if(ClaveVerif==-1){
  153.         cout<<"No consigo clave para memoria compartida VERIF"<<endl;
  154.         exit(0);
  155.     }
  156.  
  157.     idMemoriaOut=shmget (ClaveOut, sizeof(double)*340*480, 0777 | IPC_CREAT);
  158.     if(idMemoriaOut==-1){
  159.         cout<<"No consigo clave para memoria compartida OUT1"<<endl;
  160.         exit(0);
  161.     }
  162.  
  163.  
  164.     idMemoriaIn=shmget (ClaveIn, sizeof(int)*340*480, 0777 | IPC_CREAT);
  165.     if(idMemoriaIn==-1){
  166.        cout<<"No consigo clave para memoria compartida IN1"<<endl;
  167.        exit(0);
  168.     }
  169.  
  170.  
  171.     idMemoriaVerif=shmget (ClaveVerif, sizeof(bool)*340*480, 0777 | IPC_CREAT);
  172.     if(idMemoriaVerif==-1){
  173.        cout<<"No consigo clave para memoria compartida VERIF1"<<endl;
  174.        exit(0);
  175.     }
  176.  
  177.     matriz_in = (int**)shmat (idMemoriaIn, (char*)0,0);
  178.     if(matriz_in ==NULL ){
  179.         cout<<"No se consiguio memoria compartida"<<endl;
  180.         exit(0);
  181.     }
  182.  
  183.     matriz_out = (double**)shmat (idMemoriaOut, (char*)0,0);
  184.     if(matriz_out ==NULL ){
  185.         cout<<"No se consiguio memoria compartida"<<endl;
  186.         exit(0);
  187.     }
  188.  
  189.     matriz_verif = (bool**)shmat (idMemoriaVerif, (char*)0,0);
  190.     if(matriz_verif ==NULL ){
  191.         cout<<"No se consiguio memoria compartida"<<endl;
  192.         exit(0);
  193.     }
  194.  
  195.     matriz_in = new int * [340];
  196.     for (int i=0; i<340; i++)
  197.         matriz_in[i] = new int [480];
  198.  
  199.     matriz_out = new double * [340];
  200.     for (int i=0; i<340; i++)
  201.         matriz_out[i] = new double [480];
  202.  
  203.     matriz_verif = new bool* [340];
  204.     for (int i=0; i<340; i++)
  205.         matriz_verif[i] = new bool [480];
  206.  
  207.     time_t start,end;
  208.     double dif;
  209.     pid_t pid[9];
  210.     time (&start);
  211.     asignar_limites();
  212.     inicializar_verif();
  213.     cargar_datos();
  214.     for(int i=0;i<9; i++){
  215.         pid[i] =fork();
  216.         if(pid[i]==0){
  217.             aplicar_filtro(limites[i][0], limites[i][1], limites[i][2], limites[i][3] );
  218.             //exit(2);
  219.             cout<<pid[i];
  220.             guardar_datos();
  221.         }
  222.         else if(pid<0){
  223.             cerr << "Failed to fork" << endl;
  224.             exit(1);
  225.         }
  226.         else {
  227.             cout<<pid[i];
  228.             time (&end);
  229.  
  230.             dif = difftime (end,start);
  231.             cout<<"El tiempo es "<<dif<<" segundos"<<endl;
  232.  
  233.             shmdt ((double **)matriz_out);
  234.             shmctl (idMemoriaOut, IPC_RMID, (struct shmid_ds *)NULL);
  235.  
  236.             shmdt ((int **)matriz_in);
  237.             shmctl (idMemoriaIn, IPC_RMID, (struct shmid_ds *)NULL);
  238.  
  239.             shmdt ((bool **)matriz_verif);
  240.             shmctl (idMemoriaIn, IPC_RMID, (struct shmid_ds *)NULL);
  241.  
  242.  
  243.  
  244.         }
  245.  
  246.         return 0;
  247.     }
  248. }
  249.  

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
« última modificación: Lunes 11 de Mayo de 2009, 17:38 por daniels13ca »

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Probelma froks y memoria compartida (linux)
« Respuesta #1 en: Lunes 11 de Mayo de 2009, 09:42 »
0
Usa las etiquetas de código y a lo mejor me molesto en leerlo.

daniels13ca

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Probelma froks y memoria compartida (linux)
« Respuesta #2 en: Lunes 11 de Mayo de 2009, 17:36 »
0
Cita de: "m0skit0"
Usa las etiquetas de código y a lo mejor me molesto en leerlo.
ya, gracias

daniels13ca

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Probelma froks y memoria compartida (linux)
« Respuesta #3 en: Martes 12 de Mayo de 2009, 00:03 »
0
ya lo solucione:
Código: C++
  1.  
  2. #include <iostream>
  3. #include <fstream>
  4. #include <string>
  5. #include <cstdlib>
  6. #include <string.h>
  7. #include <sys/shm.h>
  8. #include <unistd.h>
  9. #include <sys/timeb.h>
  10.  
  11.  
  12. using namespace std;
  13.  
  14.  
  15. struct matrices
  16. {
  17.     int matriz_in[340][480];
  18.     double matriz_out[340][480];
  19.     bool matriz_verif[340][480];
  20. };
  21.  
  22.  
  23. int limites[4][9];
  24.  
  25.  
  26.  
  27.  
  28. void inicializar_verif(matrices *datos){
  29.     for(int i=0; i<340; i++){
  30.         for(int j=0; j<480; j++){
  31.             datos->matriz_verif[i][j]= false;
  32.         }
  33.     }
  34. }
  35.  
  36. void cargar_datos(matrices *datos){
  37.    ifstream entrada;
  38.    entrada.open("matriz.txt");
  39.    if (!entrada){
  40.       cerr<<"Error al abrir el archivo";
  41.    }
  42.    char buffer[1500];
  43.    for(int i=0;i<340;i++){
  44.          entrada.getline(buffer, 1500);
  45.          char *num= strtok(buffer, " ");
  46.          datos->matriz_in[i][0]= atoi(num);
  47.          for(int j=1; j<480; j++){
  48.             num = strtok(NULL, " ");
  49.             datos->matriz_in[i][j]= atoi(num);
  50.          }
  51.    }
  52.    entrada.close();
  53. }
  54.  
  55.  
  56. void aplicar_filtro(int ini_x, int fin_x, int ini_y, int fin_y, matrices *datos ){
  57.  
  58.     int contador_i =1 ;
  59.         int contador_j =1 ;
  60.  
  61.         for(int i=ini_x;i<fin_x;i++){
  62.             for(int j=ini_y; j<fin_y; j++){
  63.                 if(datos->matriz_verif[i][j]==false){
  64.                     if(contador_i==2 && contador_j==2){
  65.                         datos->matriz_out[i][j]= datos->matriz_in[i][j] * 0;
  66.                     }else{
  67.                         datos->matriz_out[i][j]= datos->matriz_in[i][j] * 0.125;
  68.                     }
  69.                     datos->matriz_verif[i][j]=true;
  70.                }
  71.                 contador_j++;
  72.                 if(contador_j==4) contador_j=1;
  73.             }
  74.             contador_i++;
  75.             if(contador_i==4) contador_i=1;
  76.         }
  77.  }
  78.  
  79.  
  80. void guardar_datos(matrices *datos){
  81.     ofstream salida("matriz_transformada.txt", ios::app);
  82.     for(int i=170; i<340; i++){
  83.         for(int j=0; j<480; j++){
  84.             salida<<datos->matriz_out[i][j]<<" ";
  85.         }
  86.     salida<<"n";
  87.  
  88.     }
  89.     salida.close();
  90.  
  91. }
  92.  
  93. void asignar_limites(){
  94.     limites[0][0]=170;
  95.     limites[0][1]=228;
  96.     limites[0][2]=0;
  97.     limites[0][3]=162;
  98.     limites[1][0]=170;
  99.     limites[1][1]=228;
  100.     limites[1][2]=160;
  101.     limites[1][3]=322;
  102.     limites[2][0]=170;
  103.     limites[2][1]=228;
  104.     limites[2][2]=320;
  105.     limites[2][3]=480;
  106.     limites[3][0]=226;
  107.     limites[3][1]=284;
  108.     limites[3][2]=0;
  109.     limites[3][3]=162;
  110.     limites[4][0]=226;
  111.     limites[4][1]=284;
  112.     limites[4][2]=160;
  113.     limites[4][3]=322;
  114.     limites[5][0]=226;
  115.     limites[5][1]=284;
  116.     limites[5][2]=320;
  117.     limites[5][3]=480;
  118.     limites[6][0]=282;
  119.     limites[6][1]=340;
  120.     limites[6][2]=0;
  121.     limites[6][3]=162;
  122.     limites[7][0]=282;
  123.     limites[7][1]=340;
  124.     limites[7][2]=160;
  125.     limites[7][3]=322;
  126.     limites[8][0]=282;
  127.     limites[8][1]=340;
  128.     limites[8][2]=320;
  129.     limites[8][3]=480;
  130. }
  131.  
  132. int main()
  133. {
  134.  
  135.  
  136.    
  137.     struct timeb ini;
  138.     struct timeb fin;
  139.     pid_t pid;
  140.  
  141.     int idMemoria;
  142.     matrices * apt;
  143.     void * memoria;
  144.  
  145.     idMemoria = shmget((key_t)4322, sizeof (matrices), 0666 | IPC_CREAT);
  146.     if (idMemoria == -1)
  147.     {
  148.         cout << "No consigo clave para memoria compartida" << endl;
  149.         exit(0);
  150.     }
  151.  
  152.     memoria = (int *) shmat(idMemoria, (void *) 0, 0);
  153.     if (memoria == (void *) -1)
  154.     {
  155.         cout << "No se consiguio memoria compartida" << endl;
  156.         exit(-1);
  157.     }
  158.  
  159.     apt = (matrices *) memoria;
  160.  
  161.     ftime(&ini);
  162.     asignar_limites();
  163.     inicializar_verif(apt);
  164.     cargar_datos(apt);
  165.     for(int i=0;i<9; i++){
  166.         pid =fork();
  167.         if(pid<0){
  168.             cout<<"fork failed";
  169.             exit(-1);
  170.         }
  171.         if(pid==0){
  172.             aplicar_filtro(limites[i][0], limites[i][1], limites[i][2], limites[i][3], apt);
  173.             return 0;
  174.         }
  175.     }
  176.     ftime(&fin);
  177.     cout<<"El tiempo es "<<fin.millitm - ini.millitm<<" milisegundos"<<endl;
  178.     //sleep(5);
  179.     guardar_datos(apt);
  180.     return 0;
  181. }
  182.  

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Probelma froks y memoria compartida (linux)
« Respuesta #4 en: Martes 12 de Mayo de 2009, 14:06 »
0
Gracias por postear la solución  :good: . Al final no tuve tiempo para mirarlo, disculpa.

daniels13ca

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Probelma froks y memoria compartida (linux)
« Respuesta #5 en: Martes 12 de Mayo de 2009, 18:55 »
0
Cita de: "m0skit0"
Gracias por postear la solución  :good: . Al final no tuve tiempo para mirarlo, disculpa.
no hay problema