elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  ERROR! EN SINCRONIZACION DE PROCESOS
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ERROR! EN SINCRONIZACION DE PROCESOS  (Leído 2,430 veces)
Odai

Desconectado Desconectado

Mensajes: 25


Odai


Ver Perfil
ERROR! EN SINCRONIZACION DE PROCESOS
« 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



En línea

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

Desconectado Desconectado

Mensajes: 4



Ver Perfil
Re: ERROR! EN SINCRONIZACION DE PROCESOS
« Respuesta #1 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.



En línea

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

Desconectado Desconectado

Mensajes: 25


Odai


Ver Perfil
Re: ERROR! EN SINCRONIZACION DE PROCESOS
« Respuesta #2 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!
En línea

Tengo demasiadas fantasías para ser una ama de casa.
Marilyn Monroe
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Listar procesos y realizar cosas con los procesos
Programación Visual Basic
sebas369 2 3,415 Último mensaje 14 Julio 2006, 16:08 pm
por sebas369
Ayuda con sincronización de procesos para MITM en C++
Programación C/C++
Kaxperday 3 3,787 Último mensaje 15 Julio 2015, 19:41 pm
por x64core
Error de sincronización
Android
novalida 0 3,692 Último mensaje 9 Septiembre 2015, 18:58 pm
por novalida
entender sincronizacion de procesos(semaforos,monitores) en c#
.NET (C#, VB.NET, ASP)
jhulyo 0 2,098 Último mensaje 15 Abril 2017, 00:10 am
por jhulyo
Sincronización de procesos
Programación C/C++
prosebas 1 5,250 Último mensaje 25 Mayo 2021, 01:10 am
por RayR
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines