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
}
cout << "Semaforo inicializado id = " << sem_id << "\n";
}
- else // Si soy otro espero un poco por las dudas para que corra el 1ro
- {
- usleep(1000);
- }
srand(getpid());