Consultas, desarrollo de programas y petición de presupuestos:

jueves, 12 de julio de 2012

SISTEMAS DE PROCESOS

¿Que es lo que hace el bash?
-Todo proceso tiene asignado a un numero de identificación de proceso (pid) y un proceso padre
ver comandos:
ps : ver procesos
kill: enviar señales a un proceso, señal tipica era para matarlo

El proceso Bash, tiene la funcion de darnos la oportunidad de escribir ordenes.

Cuando escribo ls, tengo dos bash, uno con el comando ls, y otro cargado en memoria.
Padre crea el hijo (bash.hijo) y el hijo es el que convierte en ls

Cada proceso crea 3 descriptores de archivo:
-stdin (0)
-stdout (1)
-stderr (2)

Redirección de los dos descriptores al mismo archivo:
1>fichero.txt 2>&1
Agrupación de comandos:

Se pueden agrupar de dos formas:
  • usando parentesis ()
  • usando llaves {}

comando1 ; comando2
empieza el comando1, cuando termine comando1, empieza el comando2

(comando1 ; comando2)
lo agrupo y lo trata como si fuera un solo comando,en un duplicado de bash

{comando1 ;comando2}
lo agurpo y lo trata como si fuera un solo comando, sobre el mismo proceso de bash

Utilidad de agrupar comandos:
Tenemos estos dos script de bash
Lo que ejecuta es:
Espera 10 segundo, ejecuta ls, y luego de terminar ls, ejecuta cat fichero.txt
Lo que ejecuta es:
Que espere 10 segundos para hacer un ls, (en 2º plano) pero que ejecute cat en paralelo, sin esperar al ls ni al sleep
Sleep 10
(Sleep 10 ; ls) &
ls


Cat fichero.txt
Cat fichero.txt

PROGRAMA C USANDO FORK
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>


#include <wait.h> // Esperar al hijo que tiene


// este programa hace un duplicado del bash

int main() {
    pid_t pid;  // tipos "raros",son normalmente enteros, (ver man)
    int i = 0;

    pid = fork();    // crea un duplicado de este programa            // Se crea un proceso
    // la funcion fork() devuelve:  al padre le devuelve pid que le corresponde al hijo (un numero que le dara la maquina, no sabemos cual)
    //                              al hijo le devuelve 0
    // si a fallado el fork, le devuelve -1 al padre
   
   
   
    switch (pid) {
    case -1:
         // fork() ha fallado
        fprintf(stderr, "Error al crear el proceso con fork");
        exit(-1);  // cualquier cosa que no sea 0
    case 0:                    // Proceso hijo
        // lo ejecuta el hijo.. el padre nunca ejecutara esta linea.
       
        while (i < 25) {
            printf("Hijo: %d\n", i++);
            sleep(1); // espera 1 segundo, y mostrara 20 mensajes
        }
        break;
    default:                // Proceso padre, no sabemos el numero que le va a devolver al crear el hijo, por eso es el default.
        while (i < 10) {
            if (i==5) {
                wait(NULL); //hace que al llegar el 5, el padre para, y se espera que termine el hijo, para continuar.
            }
            printf("Padre: %d\n", i++);
            sleep(2); //espera 2 segundos, y muestra 10 mensajes
           
        }
        break;
    }
    printf("Proceso terminado\n");
    return 0;
}

No hay comentarios:

Publicar un comentario en la entrada