]> git.llucax.com Git - z.facultad/75.74/practicos.git/blobdiff - practicas/practica2/P02e1201.cpp
Terminado 2.1.2 (con mucha bussy wait pero funciona).
[z.facultad/75.74/practicos.git] / practicas / practica2 / P02e1201.cpp
index b53feaa1ed3ac244b4db60e134dca7fb9bf0ded2..c730202c2f63e8beb04bd04fd7209bd2bb9afc6c 100644 (file)
@@ -62,29 +62,31 @@ int main(int argc, char *argv[])
     int proc = atoi(argv[1]);
 
     // Shared memory
-    int shm_id = shmget(SHM_KEY, sizeof(Molinete), IPC_CREAT | 0666);
-    if (shm_id == -1)
+    int shm_id;
+    do
     {
-        cerr << "Error al crea/obtener shared memory.\n";
-        return 2;
+        shm_id = shmget(SHM_KEY, sizeof(Molinete),
+            (proc ? 0 : IPC_CREAT) | 0666); // crea solo si es el proceso 0
     }
+    while (proc != 0 && shm_id == -1);
     Molinete* molinete = (Molinete*) shmat(shm_id, NULL, 0);
     if (molinete == (Molinete*) -1)
     {
         cerr << "Error al attachear shared memory.\n";
         return 3;
     }
-    cout << "Shared memory id = " << shm_id << "\n";
 
     // Semaforo
-    int sem_id = semget(SEM_KEY, 1, 0666 | IPC_CREAT);
-    if (sem_id == -1)
+    int sem_id;
+    do
     {
-        cerr << "Error al crea/obtener semaforo.\n";
-        return 4;
+        sem_id = semget(SEM_KEY, 1,
+            (proc ? 0 : IPC_CREAT) | 0666); // crea solo si es el proceso 0
     }
+    while (proc != 0 && sem_id == -1);
+
     // Si es el primero, inicializo
-    if (!proc)
+    if (proc == 0)
     {
         *molinete = 0;
         if (semctl(sem_id, 0, SETVAL, 1) < 0) // pongo 1 en el sem
@@ -94,15 +96,11 @@ int main(int argc, char *argv[])
         }
         cout << "Semaforo inicializado id = " << sem_id << "\n";
     }
-    else // Si soy otro espero un poco por las dudas para que corra el 1ro
-    {
-        usleep(10000);
-    }
 
     srand(getpid());
 
     // Maxima cantidad de iteraciones (puede venir por parametro)
-    int max_iter = 100000;
+    int max_iter = 100;
     if (argc > 2)
         max_iter = atoi(argv[2]);