Hola... estoy tratando de sincronizar tres procesos. Antes de eso, en un vector guardo las posiciones en como se ejecutaran, utilizo semaforos para poder sincronizarlos, pero no me sale , los procesos no se muestran en pantalla como deberia ser segun el vector de posiciones... Porfis si alguien me puede ayudar... aqui abajo dejo el codigo...
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <stdlib.h>
#include <unistd.h>
#include <wait.h>
#include <sys/types.h>
#include <errno.h>
#include <semaphore.h>
#define ROJO 0
#define AZUL 0
#define VERDE 1
#define n 4
int hijo;
int proc;
void procesos(int x)
{
int i;
proc=1;
for (i = 1; i< n; ++i)
{
hijo = fork();
if (hijo ==-1) {
perror("No se puede crear el proceso");
exit(-1);}
else if(hijo==0){
proc= i;
break; // si es un hijo terminar el for (solo el padre crea los hijos)
}
}
//return i;
}
void V(int sem, int m)
{
struct sembuf sop;
//construcción arreglo operaciones de un elemento
sop.sem_num= m;
sop.sem_op= 1; /* +1 -> desbloquea*/
sop.sem_flg= 0;
//bloquea hasta que el recurso es liberado
semop (sem,&sop,1);
}
void P(int sem,int m)
{
struct sembuf sop;
// construcción arreglo operaciones de un elemento
sop.sem_num= m;
sop.sem_op=-1; // bloquea solo una unidad
sop.sem_flg= 0;
//bloquea hasta que el recurso es liberado
semop(sem,&sop,1);
}
void scribir (int dir, int pro){
printf("\t1.- proceso %d GETPID() %d getppid() %d\n", dir, pro, getppid());
printf("\t2.- proceso %d GETPID() %d getppid() %d\n", dir, pro, getppid());
printf("\t3.- proceso %d GETPID() %d getppid() %d\n", dir, pro, getppid());
printf("\n****************************************************\n");
}
main(int argc, char *argv[]) {
int i, j, x, y, semid, orden[n-1];
key_t llave;
system("clear");
//Petición de un identificador con dos semaforos
llave=ftok(argv[0],'K');
if ((semid=semget(llave,3,IPC_CREAT|0600))==-1)
{
perror("semget");
exit(-1);
}
//Cerramos el semáforo del proceso
semctl(semid,ROJO,SETVAL,0);
//semctl(semid,AZUL,SETVAL,0);
//Abrimos el semáforo del proceso
semctl(semid,VERDE,SETVAL,1);
printf("\tSEMAFOROS\n");
srand(time(0));
for(i=0; i< n-1; i++)
orden = rand()%3+1;
for(i=0; i< n-1; i++)
printf(" \tnum %d proces %d\n",i+1, orden);
i=0;
j=0;
procesos(n);
i=0;
switch(proc){
case 1:
while(i< n-1){
P(semid, ROJO);
if(orden == proc)
scribir(proc, getpid());
i++;
V(semid, VERDE);
}
case 2:
while(i< n-1){
P(semid, VERDE);
if(orden == proc)
scribir(proc, getpid());
i++;
V(semid,AZUL);
}
case 3:
while(i<n-1){
P(semid, AZUL);
if(orden[i++] == proc)
scribir(proc, getpid());
i++;
V(semid, ROJO);
}
} //fin de switch()
semctl(semid,0,IPC_RMID,0);
}//fin de prog