IMPORTANT: Per accedir als fitxer de subversion: http://acacha.org/svn (sense password). Poc a poc s'aniran migrant els enllaços. Encara però funciona el subversion de la farga però no se sap fins quan... (usuari: prova i la paraula de pas 123456)

Part web de UD 5. Crides al sistema Linux. Processos.

NA1. Crides al nucli del sistema

Exercicis

Creació d'un procés fill amb fork()

Feu un script de PHP que faci el següent:

  • Crei un nou procés fill amb la funció fork() [1]
  • El codi del procés pare ha de mostrar un missatge que l'identifiqui per la línia de comandes i ha de mostrar el seu PID [2]. A més, ha de mostrar el PID del seu fill. Per exemple:
Hola soc el procés pare! (PID: 15268) El PID del meu fill és : 15280
  • El mateix ha de fer el procés fill però mostrant el PID del seu pare [3]. Exemple:
Hola soc el procés fill! (PID: 15280) El PID del meu pare és : 15268

Solució:

#!/usr/bin/php5 -q
<?php

$pid = pcntl_fork();
if ($pid == -1) {
     die('El fork no ha anat correctament');
} else if ($pid) {
     // Qualsevol valor de retorn diferent a zero representa el pare. 
     echo "Hola sóc el pare! (PID:".posix_getpid().") ";
     // El valor de la variable de reotrn de fork ($pid) és el PID del fill
     echo "El PID del meu fill és: ". $pid;	
     pcntl_wait($status); //Protect against Zombie children
} else {
     // Aqui va el codi del procés fill
     echo "Hola sóc el fill! (PID:".posix_getpid().") ";
     echo "El pid del meu pare és:";
     echo posix_getppid();
}
?>

Creació de processos amb fork(). Estructura d'arbre dels processos

Segons el següent script de PHP:

#!/usr/bin/php5 -q
<?php

$pid = pcntl_fork();
if ($pid == -1) {
     die('El fork 1 no ha anat correctament');
} else if ($pid) {
     // Qualsevol valor de retorn diferent a zero representa el pare. 
     echo "Hola sóc el pare! (PID:".posix_getpid()."). ";
     // El valor de la variable de retorn de fork ($pid) és el PID del fill
     echo "El PID del meu fill és: ". $pid . "\n";	
     
} else {
     // Aqui va el codi del procés fill
     echo "Hola sóc el fill! (PID:".posix_getpid()."). ";
     echo "El pid del meu pare és:";
     echo posix_getppid()."\n";
}

$pid1 = pcntl_fork();
if ($pid1 == -1) {
     die('El fork 2 no ha anat correctament');
} else if ($pid1) {
     echo "Hola sóc el pare 2! (PID:".posix_getpid()."). ";
     echo "El PID del meu fill és: ". $pid1."\n";;	
} else {
     echo "Hola sóc el fill 2! (PID:".posix_getpid()."). ";
     echo "El pid del meu pare és:";
     echo posix_getppid()."\n";;
}

sleep (500);

?>

Responeu a les següents preguntes:

  • Podeu preveure l'ordre en que s'executaran els diferents processos? Raoneu la vostra resposta.
  • Executeu el programa diferents cops i observeu-ne el resultat. Feu un arbre de processos que mostri l'ordre i els PIDs del processos en una de les execucions
  • Observeu amb la comanda pstree o mitjançant un monitor de tasques o de sistema gràfic, la relació entre els processos fills i pares de l'exemple
  • Utilitzant la funció sleep, controleu l'ordre en que s'executen els processos. Expliqueu un exemple.

Recursos

Solució:

  • Podeu preveure l'ordre en que s'executaran els diferents processos? No. L'ordre en que la CPU executa els processos no està determinat a priori
$ ./AnalisiExempleFork.php 
Hola sóc el fill! (PID:24802). El pid del meu pare és:24801
Hola sóc el fill 2! (PID:24803). El pid del meu pare és:24802
Hola sóc el pare! (PID:24801). El PID del meu fill és: 24802
Hola sóc el fill 2! (PID:24804). El pid del meu pare és:24801
Hola sóc el pare 2! (PID:24802). El PID del meu fill és: 24803
Hola sóc el pare 2! (PID:24801). El PID del meu fill és: 24804

http://acacha.dyndns.org/mediawiki/index.php/Processos_Linux#Monitor_del_sistema._Gnome

Tipus de processos

Segons els següent codi (observeu (en negreta) com forcem que l'execució del fill succeeixi després de la sortida del procés pare):

#!/usr/bin/php5 -q
<?php 

$pid = pcntl_fork();
if ($pid == -1) {
     die('El fork 1 no ha anat correctament');
} else if ($pid) {
     // Qualsevol valor de retorn diferent a zero representa el pare. 
     echo "Hola sóc el pare! (PID:".posix_getpid()."). ";
     // El valor de la variable de retorn de fork ($pid) és el PID del fill
     echo "El PID del meu fill és: ". $pid . "\n";
     exit();
} else {
     // Aqui va el codi del procés fill
     sleep (10);
     echo "Hola sóc el fill! (PID:".posix_getpid()."). ";
     echo "El pid del meu pare és:";
     echo posix_getppid()."\n"; 

}
  • Quin serà el PID del pare ('ppid)? Expliqueu el perquè?
  • Si fem referència al fill. Com s'anomenen aquest tipus de processos?

Ara executeu el següent codi:

#!/usr/bin/php5 -q
<?php

$pid = pcntl_fork();
if ($pid == -1) {
     die('El fork 1 no ha anat correctament');
} else if ($pid) {
     // Qualsevol valor de retorn diferent a zero representa el pare. 
     echo "Hola sóc el pare! (PID:".posix_getpid()."). ";
     // El valor de la variable de retorn de fork ($pid) és el PID del fill
     echo "El PID del meu fill és: ". $pid . "\n";

     sleep(20);                //Sleep abans de wait
     pcntl_wait($status); 
     sleep(10);               //Sleep després de wait
     exit();
} else {
     // Aquí va el codi del procés fill 
     echo "Hola sóc el fill! (PID:".posix_getpid()."). ";
     echo "El pid del meu pare és:";
     echo posix_getppid()."\n";
     exit();
}
?>

Si heu anomenat el fitxer Exemple.php, executeu:

$ watch "ps aux | grep Exemple"

I observeu quina és la evolució dels estats dels processos.

  • Quins són els estats dels processos pare i fill durant la execució de la funció sleep(20)? i durant la execució de l'sleep(10)? A que es degut el canvi d'estat del procés fill entre els dos sleeps? Raoneu la vostra resposta
  • Com s'anomenen el processos que estan en l'estat del procés fill durant la execució de l'sleep(20)?

Recursos:

Simular les comandes bg i fg amb php

http://acacha.dyndns.org/mediawiki/index.php/NA2._Gesti%C3%B3_de_processos#Simulaci.C3.B3_de_l.27execuci.C3.B3_de_comandes_des_de_la_terminal

NA2. Gestió de processos

NA3. Comunicació entre processos