ERROR! EN SINCRONIZACION DE PROCESOS

Iniciado por Odai, 30 Abril 2013, 15:37 PM

0 Miembros y 1 Visitante están viendo este tema.

Odai

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

Tengo demasiadas fantasías para ser una ama de casa.
Marilyn Monroe

TheBreadface

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.

Mi crimen es la curiosidad. Mi crimen es juzgar a las personas por lo que dicen y no por lo que aparentan.Nosotros existimos sin color, sin nacionalidad,sin prejuicios religiosos. Nosotros únicamente buscamos detrás del conocimiento. Ese es nuestro CRIMEN

Odai

GRACIAS :( el maestro es un poco especial y lo quiere asi, con semaforos y fork(), yo tambien habia pensado cambiarlo... GRACIAS!
Tengo demasiadas fantasías para ser una ama de casa.
Marilyn Monroe