¿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