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
Te comento.. por que el programa es un poco lió.
1) si es cierto que el fork() copia el código exacto del padre salvo sus Identificadores BCP.... Pero no es necesario que sigas el código del padre a mi en SO me enseñaron que puedes utilizar funciones que cambian el código a un .exe o a una función en cuestión la excl("funcionquequieresllamar",Parametrosquelequierasmandar); hace que se ejecute.Mucho menos lioso y mejor para entender creo que si lo haces así no tendrás problemas.
2)Las prioridades en linux pueden ser FCFS(FIFO) o RoundRobin o por ultimo nice esto influye el numero de núcleos y etc te recomiendo que reconstruyas de nuevo el programa.
GRACIAS :( el maestro es un poco especial y lo quiere asi, con semaforos y fork(), yo tambien habia pensado cambiarlo... GRACIAS!