lunes, 19 de septiembre de 2011

practica PID

CODIGO DEL PROGRAMA

#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>

int main (int arge, char * argv[])
{
            int num;
            pid_t pid;
           
            for(num=0; num < 3; num++)
            {
                        pid = fork();
                        printf("Soy el proceso pid %d y mi padre tiene %d de pid \n",
                        getpid(), getppid());
                       
                        if (pid != 0)
                        {
                                   break;
                                   srandom(getpid());
                                   sleep (random() %3);
                        }

            }

            if (pid != 0)
            {

                        printf("Fin del proceso pid %d \n", wait (NULL));
                        return 0;
            }
}
           

RESULTADO DEL PROGRAMA COMPILADO Y EJECUTADO EN UNA TERMINAL DE LINUX

EXPLICACION
1.- ¿POR QUE APARECEN MENSAJES REPETIDOS?
POR EL CICLO QUE EL MULTIPLICA
2.- ¿QUE OBSERVAS?
se crea un proceso hijo que imprime en pantalla el pid de su proceso padre, mientras que el proceso padre imprime en pantalla su propio pid y el del proceso hijo que ha creado. Para ello, se utilizan las llamadas al sistema getpid() y getppid(). El proceso padre, antes de finalizar se suspende hasta que el hijo acaba, para evitar que éste se quede zombie. Para ello, utiliza la llamada al sistema wait(), que recibe en la variable status el estado en que el proceso hijo finalizó.


3.- ¿POR QUE?
wait()
sintaxis
int pid wait (int*status)

archivo de cabecera
#include<sys/types.h>
#include<sys/wait.h>

El proceso que realiza quedara en espra de que cualquiera  de sus hijos finalice

La orden devolvera cuando finalice uno de los hijos de proceso que ejecute el wait() el PID del hijo que ha finalizado

La orden toma como parametro un entero que contendra al finalizar la orden el codigo de finalizaicon del hijo que ha terminado

fork()
 crea un nuevo proceso exactamente igual (mismo código) al proceso que invoca la función. Ambos procesos continúan su ejecución tras la llamada fork(). En caso de error, la función devuelve el valor -1 y no se crea el proceso hijo. Si no hubo ningún error, el proceso padre (que realizó la llamada) recibe como resultado el pid del proceso hijo que acaba de nacer, y el proceso hijo recibe el valor 0.


Publicado por Maria Isabel Serrano Medina 1701

1 comentario: