• Publicidad

Por qué la función fork se pasa a una variable normal

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Por qué la función fork se pasa a una variable normal

Notapor ostpulse » 2015-02-23 09:43 @446

¡ Hola a Todos ! :)

Recién empiezo a ver la función fork y me surge una gran duda: ¿Por qué fork() se le pasa a una variable escalar?

Es decir, en el siguiente conjunto de instrucciones:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $pid = fork;
  2.  
  3. if ($pid){
  4.     # instructions goes here
  5.     ....
  6. }else{
  7.     # more instructions here
  8.     ....
  9. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

No logro entender el porqué de la primera línea y tampoco logro comprender la construcción if($pid), que quiere decir realmente, si el valor de PID es 0 o no es 0.

Adjunto a esta pregunta que soy principiante y dado que yo a mi lógica lo que haría en el if() sería poner una condición tal como if($pid != 0 ), entonces en el ejemplo anterior la condición no está explícitamente escrita pero entonces, ¿qué significa?

Muchas gracias y adjunto al tema que recién empiezo por si digo alguna barbarie :P
ostpulse
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2015-02-22 14:09 @631

Publicidad

Re: Por qué la función fork se pasa a una variable normal

Notapor explorer » 2015-02-23 10:49 @492

Bienvenido a los foros de Perl en Español, ostpulse.

Sacado de perldoc -f fork:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
    fork    Hace una llamada del sistema fork(2) para crear un nuevo proceso
            ejecutando el mismo programa en el mismo punto. Devuelve el pid
            del hijo al proceso padre, 0 al proceso hijo, o "undef" si no se
            consiguió el fork. Descriptores de archivo (y algunas veces
            bloqueos en estos descriptores) son compartidos, mientras que todo
            lo demás es copiado. En la mayoría de los sistemas que soportan
            fork(), se ha tenido gran cuidado en hacerlo extremadamente
            eficiente (por ejemplo, usando la tecnología copy-on-write en
            páginas de datos), haciendo de él el paradigma dominante de la
            multitarea en las últimas décadas.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Como ves, la llamada a fork() puede devolver uno de tres valores distintos: el pid, un '0' o un 'undef'.

El hacer el if() permite distinguir el primer caso entre los dos siguientes.

Entonces, quedaría mejor explicado así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $pid = fork();
  2.  
  3. if ($pid) {
  4.                 # si es positivo, es que somos el proceso padre
  5. }
  6. elsif (defined $pid) {
  7.                 # si es '0', somos el proceso hijo
  8. }
  9. else {
  10.                 # si es indefinido, ha ocurrido un error haciendo el fork
  11. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Por qué la función fork se pasa a una variable normal

Notapor ostpulse » 2015-02-23 13:08 @589

Hola explorer y muchas gracias por la respuesta :)

El problema que tengo en el if() es que si éste permite entre las tres posibles respuestas del fork(), entiendo que si fork() devuelve un undef, éste será captado por el bloque del else{}, pero ¿cómo distingues la respuesta cuando el fork devuelve un 0 o el pid del proceso?, es decir, si tenemos la sentencia (que normalmente es la que veo escrita cuando se trata del fork):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if ($pid){
  2.     # code here
  3. }
  4.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Mi pregunta reside en cómo con tan solo una condición diferenciamos dos posibles estados, es decir, cómo con tan solo if ( $pid ) diferenciamos si es un 0 o otro valor...

Quizá realmente cuando se desee diferenciar si es un 0 o otro valor se escriba la condición tal como if ( $pid >0 ), pero si la condición no está presente explícitamente, al programador le da igual el valor devuelto. ¿O no?

Perdona que le dé tantas vueltas a la pregunta pero es lo que no pillo :oops:
ostpulse
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2015-02-22 14:09 @631

Re: Por qué la función fork se pasa a una variable normal

Notapor explorer » 2015-02-23 17:29 @770

¡Ah!, entiendo.

Cuando en un if() aparece una variable escalar, se dice que se cumple la condición (del if()) si ese escalar contiene algo que se considera que es verdadero (en el sentido booleano).

Para que sea verdadero, se deben cumplir dos condiciones: que el valor almacenado en el escalar esté definido (es decir, que no sea 'undef') y que sea un valor distinto de 0 (o '0', '' y (). Consultar Verdad y Falsedad en perlsyn).

Si no se cumplen esas dos condiciones, se ejecuta el else{}.

Si el $pid contiene el pid del proceso, será un número entero mayor que 0, así que el resultado de la condición será positivo, y se ejecutará la primera parte del if().

Si el $pid contiene un 0, entonces fallará el if() y se ejecutará la parte del else{}. Y lo mismo si contiene un 'undef'.

Entonces, en Perl, escribir

if ($pid) {

es lo mismo que

if (defined($pid) and $pid > 0) {

solo que... es más corto ;)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Por qué la función fork se pasa a una variable normal

Notapor ostpulse » 2015-02-24 08:04 @377

Muchas gracias, explorer, era justo lo que preguntaba :)

Thanks !!
ostpulse
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2015-02-22 14:09 @631


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 7 invitados

cron