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

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Pregunta sobre señales y semaforos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Pregunta sobre señales y semaforos  (Leído 3,378 veces)
y0mism0

Desconectado Desconectado

Mensajes: 238


Ver Perfil
Pregunta sobre señales y semaforos
« en: 28 Agosto 2010, 05:44 am »

Hola, tengo dudas sobre unos problemas, a ver si me las pueden aclarar. En este problema el proceso padre crea 3 hijos. Los 2 primeros hijos envian las señales sigusr1 y sigusr2 al padre respectivamente.

int main(int argc, char* argv[])
{
for (i=0;i<3;i++) { //tres veces

if(padre==1){ //sólo el padre replica

childpid = fork();

if (childpid == 0){
sleep(3);

/* Hijos */
if(i==0) //primer hijo envia señal SIGUSR1
kill(getppid(), SIGUSR2) == 1);

if(i==1) //segundo hijo envia señal SIGUSR2
kill(getppid(), SIGUSR2);

if(i==2)
printf("hijo3");
padre=0; //break; //los hijos ya no entran en el bucle otra vez
}// fin hijos

else { /* Padre */
if (signal(SIGUSR1, manejador_sigusr1)== SIG_ERR ||
signal(SIGUSR2, manejador_sigusr2)== SIG_ERR){
perror("Manejador no asignado");
exit(EXIT_FAILURE);
}
printf("padre: i=%d\n",i);
while (childpid != wait (&status))
if ((childpid == 1) && (errno != EINTR));
padre=1;

return 0;
}

Las cosas que no entiendo las he señalado en negrita. ¿para que necesita hacer un sleep(3)? Lo he visto en muchos problemas y no se para que sirve, se que durme el proceso durante 3 segundos, ¿pero para que quiere dormirlo? No lo entiendo.
Tampoco entiendo lo de

Código:
while (childpid != wait (&status))
if ((childpid == 1) && (errno != EINTR));

En otros problemas similares pones esto:

Código:
waitreturn = wait (&status);
while ( (waitreturn !=-1) || (waitreturn == -1 && errno == EINTR))
waitreturn = wait (&status);

¿por que no pone solamente wait(NULL)? Que espere a todos los hijos y ya esta, no entiendo todo ese codigo. wait(&status) devuelve el codigo del hijo y ahora lo compara con ¿-1? ¿wait devuelve -1 si da error? Aun asi no entiendo la comparacion.
Por ultimo no entiendo eso de if(padre==1)... para mi que sobra.

Bueno, para terminar una breve pregunta sobre semaforos.

Código:
libre=Semaph_create("libre",1);
libre=Semaph_create("ocupado",0);

//proceso 1
while(1){

down(libre);
down(excmut);
almacenar_elemento();
up(excmut);
up(ocupado);}

//proceso 2

while(1){

down(ocupado);
down(excmut);
almacenar_elemento();
up(excmut);
up(libre);}
¿tiene sentido aqui utilizar el semaforo excmut de exclusion mutua? Yo lo veo necesario si por ejemplo el semaforo libre estuviera inicializado a 10 y no a 1... y es que no veo ningun caso en el que 2 procesos puedan ejecutarse la sección critica a la vez... otra cosa es que se produzca una interrupcion o algo en la sección critica, pero eso no tiene nada que ver con definir un semaforo excmut...

Bueno, ojala me podais resolver algunas dudas, muchas gracias y hasta mañana.


En línea

Littlehorse
All the world's a stage
Moderador
***
Desconectado Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: Pregunta sobre señales y semaforos
« Respuesta #1 en: 28 Agosto 2010, 09:16 am »

Citar
¿para que necesita hacer un sleep(3)? Lo he visto en muchos problemas y no se para que sirve, se que durme el proceso durante 3 segundos, ¿pero para que quiere dormirlo? No lo entiendo.

Es un simple delay.

Citar
¿por que no pone solamente wait(NULL)? Que espere a todos los hijos y ya esta, no entiendo todo ese codigo. wait(&status) devuelve el codigo del hijo y ahora lo compara con ¿-1? ¿wait devuelve -1 si da error? Aun asi no entiendo la comparacion.

Revisaste los valores de retorno de wait?


RETURN VALUE

The process ID of the child which exited, or zero if WNOHANG was used and no child was available, or -1 on error (in which case errno is set to an appropriate value).
ERRORS

EINTR
    if WNOHANG was not set and an unblocked signal or a SIGCHLD was caught.

Citar
¿tiene sentido aqui utilizar el semaforo excmut de exclusion mutua? Yo lo veo necesario si por ejemplo el semaforo libre estuviera inicializado a 10 y no a 1... y es que no veo ningun caso en el que 2 procesos puedan ejecutarse la sección critica a la vez... otra cosa es que se produzca una interrupcion o algo en la sección critica, pero eso no tiene nada que ver con definir un semaforo excmut...

Por que no le ves sentido? están inicializados de esa forma porque el recurso no puede ser utilizado por mas de un proceso al mismo tiempo. Es un ejemplo básico de la idea de los semáforos de exclusión mutua.

Si podes, especifica que es lo que no te quedo claro y lo vemos mejor.

Citar
Por ultimo no entiendo eso de if(padre==1)... para mi que sobra.

Es para verificar si sos o no el proceso INIT.

Saludos


En línea

An expert is a man who has made all the mistakes which can be made, in a very narrow field.
y0mism0

Desconectado Desconectado

Mensajes: 238


Ver Perfil
Re: Pregunta sobre señales y semaforos
« Respuesta #2 en: 2 Septiembre 2010, 02:47 am »


Es un simple delay.

¿pero si se quita sigue funcionando el programa igualmente?


Citar
Revisaste los valores de retorno de wait?


RETURN VALUE

The process ID of the child which exited, or zero if WNOHANG was used and no child was available, or -1 on error (in which case errno is set to an appropriate value).
ERRORS

EINTR
    if WNOHANG was not set and an unblocked signal or a SIGCHLD was caught.

Entiendo los valores de retorno (o eso creo), pero no comprendo que hace exactamente ese codigo ni para que sirve. Me voy a referir a este es que es el que pone habitualmente:
Código:
waitreturn = wait (&status);
while ( (waitreturn !=-1) || (waitreturn == -1 && errno == EINTR))
waitreturn = wait (&status);

Wait retorna el pid del hijo que termine. Luego dice que retorna 0 ¿si no retorna ninguno y ninguno esta disponible? No se que quiere decir eso... y luego -1 si hay error.

¿esta esperando procesos hijos hasta que wait retorne -1 y errno != EINTR? ¿por que?

El otro tampoco lo entiendo... ¿childpid que toma 0 o 1 y lo compara con el wait?
Bueno a ver si puedes aclarar esto


Código:
Por que no le ves sentido? están inicializados de esa forma porque el recurso no puede ser utilizado por mas de un proceso al mismo tiempo. Es un ejemplo básico de la idea de los semáforos de exclusión mutua.

Para mi que no haria falta utilizar el excmut, que ya quedaria garantizada la exclusion mutua con solo el libre y el ocupado



Un saludo!
En línea

Littlehorse
All the world's a stage
Moderador
***
Desconectado Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: Pregunta sobre señales y semaforos
« Respuesta #3 en: 2 Septiembre 2010, 18:08 pm »

Citar
¿pero si se quita sigue funcionando el programa igualmente?

Por supuesto, pero se utiliza para dar un margen mínimo de tiempo. Es simplemente una precaución que no debería molestar al menos que el caso amerite ahorrar tiempo de donde sea.

Citar
Código
  1. waitreturn = wait (&status);
  2. while ( (waitreturn !=-1) || (waitreturn == -1 && errno == EINTR))
  3. waitreturn = wait (&status);

Wait retorna el pid del hijo que termine. Luego dice que retorna 0 ¿si no retorna ninguno y ninguno esta disponible? No se que quiere decir eso... y luego -1 si hay error.

¿esta esperando procesos hijos hasta que wait retorne -1 y errno != EINTR? ¿por que?

wait suspende la ejecución del proceso actual en pos de esperar que un hijo finalice, una señal sea entregada, o se decida finalizar el proceso actual.
En este caso estas interpretando mal el código, el significado seria:

Mientras wait no retorne error O (wait retorne error Y errno este establecido como EINTR)

Tal que EINTR establecido implica:

Citar
EINTR
    if WNOHANG was not set and an unblocked signal or a SIGCHLD was caught.


Citar
El otro tampoco lo entiendo... ¿childpid que toma 0 o 1 y lo compara con el wait?
Bueno a ver si puedes aclarar esto

childpid==0 equivale a decir "Soy un proceso hijo". Mientras childpid != wait.

Relaciona eso con el valor de retorno de wait:

Citar
The process ID of the child which exited, or zero if WNOHANG was used and no child was available, or -1 on error (in which case errno is set to an appropriate value).

Saludos
En línea

An expert is a man who has made all the mistakes which can be made, in a very narrow field.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Semáforos en C
Programación C/C++
masterson 3 11,620 Último mensaje 19 Junio 2011, 06:15 am
por CorruptedByte
Consulta semáforos y señales
Programación C/C++
NewBe 2 3,368 Último mensaje 29 Diciembre 2011, 03:57 am
por dooque
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines