Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Odai en 30 Abril 2013, 15:37 pm



Título: ERROR! EN SINCRONIZACION DE PROCESOS
Publicado por: Odai en 30 Abril 2013, 15:37 pm
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



Título: Re: ERROR! EN SINCRONIZACION DE PROCESOS
Publicado por: TheBreadface en 1 Mayo 2013, 01:23 am
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.



Título: Re: ERROR! EN SINCRONIZACION DE PROCESOS
Publicado por: Odai en 2 Mayo 2013, 14:35 pm
GRACIAS :( el maestro es un poco especial y lo quiere asi, con semaforos y fork(), yo tambien habia pensado cambiarlo... GRACIAS!