Introducción a Linux. Entradas al sistema y comandos básicos.

Anuncio
Breve historia
1962 CTSS MIT: tiempo compartido y protección
1967 MULTICS MIT, Bell, GE: el SO más avanzado de su
época. Multiusuario, multiproceso, árbol de ficheros,
intérprete de órdenes (shell), proceso individual para
cada orden.
1973 UNIX@ Bell (Thompson, Ritchie) escrito en C
1978 3BSD @ Berkeley (Joy, Babaoglu): memoria virtual
paginada
1980 4BSD @ Berkeley (DARPA) Internet
1988 X y NeWS: sistema de ventanas distribuido
1990 Normalización : Sun + AT&T, POSIX, XOPEN
1991 386BSD, GNU, Linux: versiones libres
Sistema Operativo UNIX
ÿ
¿Que es UNIX?
UNIX: un Sistema Operativo
• Compartir la memoria entre los diferentes elementos
Sistema operativo
• Compartir el CPU entre los diferentes procesos
multiproceso y multiusuario
simple y uniforme
portátil, desarrollado casi totalmente en alto nivel
muy potente
• Controlar la creación y el acceso de los archivos
• Control del hardware (E/S)
Usuarios
Entorno de trabajo
Programas de aplicación
basado en el modelo de caja de herramientas
concebido para desarrollo
fácil de extender
Administrador de la base de datos
El shell
UNIX
Hardware
Estructura del sistema
ú
û ú
Arquitectura del sistema UNIX
shell
ÿ ù
ùø úÿ
ý ù
û ú
Manejo de señales
Planificación de la CPU
Controladores de
dispositivos
Gestión de memoria
Sistema de E/S
Sistema de archivos
ÿþýüûúùø
cc
scripts
csh comp
e date a.out
sh
who
ld
wc
System calls
ccp
Kernel
grep
vi
Hard
pwd
date
ware
as
ps
cat
ls
man
more
û ù
aplicaciones
1
Núcleo del sistema UNIX
user programs
trap
Acceso a un sistema UNIX
libraries
• Para conectarse es necesario:
user level
system level
- Un nombre de usuario
system call interface
file system
process
control
8 caracteres como máximo, creado por el administrador del
sistema, (apellido, nombre, matrícula)
inter-process
communication
- Una clave de entrada, contraseña o password
Creada por el administrador del sistema y modificada por uno
mismo formada por al menos seis caracteres, (al menos dos
caracteres deben de ser diferentes a letras).
Para elegirla adecuadamente:
Evitar palabras del diccionario, nombres, números
Evitar palabras en idiomas comunes
Combinar letras con números
Elegir claves que tengan algún sentido (que sea fácil de
recordar)
Cambiarla con cierta frecuencia
scheduling
memory
management
buffer cache
character block
devices devices
hardware control
Acceso a un sistema UNIX
El shell (intérprete de comandos)
• Para entrar desde el entorno local en modo texto:
login: milogin
Password: ******
El shell es un programa que lee líneas de comando de una
terminal o archivo, las interpreta, y le indica a
• Si hay algun error:
UNIX que hacer
Login incorrect
login:
• Interfaz entre los usuarios y UNIX
• Interprete de comandos
• Si todo va bien, aparece el "prompt":
$ para el bourne shell
• Es un lenguaje de programación
% para el C-shell
• El shell no es parte del sistema operativo
ÿ
El shell (intérprete de comandos)
El entorno UNIX
• Cuatro tipos:
Cuando uno entra al sistema UNIX, el sistema les proporciona un
Shell. Este Shell proporciona al usuario un entorno propio
El entorno del usuario contiene toda la información necesaria, así
como ciertas variables
El shell almacena dos tipos de variables:
1. Bourne shell (sh, bash)
Forma parte del de la 7a. edición de UNIX y es el más viejo
de los shells principales de UNIX
2. C shell (csh)
+ las variables locales
Es el principal del UNIX BSD, más fácil de usar interactivamente
3. Korn shell (ksh)
Extensión del Bourne shell
4. Extended C shell (tcsh)
Versión mejorada del C shell
+ las variables exportadas
Las variables locales sólo son conocidas por el Shell que las creó o
modificó
Las variables exportadas pueden ser vistas por todos los sub-shells
El comando env despliega en la pantalla la lista de las variables así
como su valor
Cada vez que se crean o modifican las variables el entorno del
usuario es actualizado
Complementación interactiva de comandos y nombres archivos,
llamada sencilla de comandos previos, marca de la hora en la
lista histórica...
ÿÿ
ÿ
2
Las variables del shell
Las variables del shell
• El Shell permite almacenar valores dentro de las variables
• Para acceder el contenido de una variable, se debe anteceder el
caracter "$" a su nombre,
• El nombre de las variables debe de comenzar por una letra o un "_",
seguida por cero o más caracteres alfanuméricos o un "_"
Ejemplo:
$ echo $dir_bin
• Para asignar un valor de una variable se debe utilizar el comando set
/usr/toto/bin
$ set variable = valor
$
Ejemplo
• Existen variables utilizadas por el Shell, (mayúsculas), que son creadas
e inicializadas en el momento en que el usuario entra al sistema
$set dir_bin = /usr/local/bin
• El contenido de una variable es una cadena de caracteres
Ejemplo:
$ echo $TERM $HOME
vt100 /home/isa/jossan
$
ÿ
La variable PATH
ÿ
Cambio de clave o password
• El Shell utiliza esta variable para saber donde buscar los comandos a
ejecutar, cuando el camino de acceso no se proporciona
• Esta variable se inicializa después del " login "
• El comando passwd permite modificar el password de un usuario,
para esto el usuario deberá de conocer el password de la cuenta
que desee modificar.
• El usuario la puede modificar a su voluntad
• Los valores comunes son:
• Ejemplo:
PATH=.:/bin:/usr/bin
$ passwd
PATH=/bin:/usr/bin:.
Changing password
+ en el primer caso, el directorio actual es explorado primero
Old password: <antiguo password>
+ en el segundo caso, el directorio actual es explorado al último
New password: <nuevo password>
• Un ejemplo de modificación de la variable PATH es:
Re-enter new password: <nuevo password>
$set PATH=/bin:/usr/bin:.:$HOME/bin
ÿ
El manual de UNIX
ÿ
La línea de comandos
• La línea de comandos empieza en el prompt del Shell, hasta
<RETURN>
• Dividido en secciones:
1) Comandos de usuarios
5) Formatos de archivos
2) Llamadas de sistema
6) Juegos
3) Subrutinas
7) Varios
4) Dispositivos
8) Administración de Sistema
• La primera palabra es el nombre de un archivo ejecutable, o de un
comando interno del Shell
• El comando puede ser seguido por una o más opciones, y/o uno o más
argumentos, (separados por espacios o tabulaciones)
• La línea de comando no es ejecutado antes del <RETURN>
• El Shell contiene cuatro tipos de líneas de comandos:
• Sintaxis
man [ opcion ] [ seccion ] titulo(s)
- simple
- secuencial
- pipeline
- agrupado
• Para poder capturar una línea de comando muy larga, es posible de
insertar el caracter " \ " al final de la primera línea, después de teclear
<RETURN> para poder teclear el resto de la línea de comando en
una segunda línea de la terminal
• Ejemplo:
$ man mkdir
ÿ
ÿ
3
La línea de comandos
Tipos de comandos
nombre [-opciones] [argumentos]
Nombre
Cualquier fichero ejecutable que sea accesible
nombre absoluto
nombre relativo (se busca en PATH)
Opciones: son modificadores del programa
casi siempre precedidas por
casi siempre acumulativas
-abcd --opcion
ls –alR .
ls –lR --all .
a veces con argumentos man -S 1 ls
Argumentos
son los operandos del programa
Informativas
man (por secciones), info, netscape, lynx, gv
date, cal, ps, pwd
Ejecutivas
De usuario: lpr, cp, mv, rm
De sistema: sync, halt, reboot, shutdown
Procesadoras
cmp
editores (edit, joe, pico, vi, emacs)
sort, cat, head, tail, grep, awk
diff
ÿ
Dispositivos estándar
Redirección de dispositivos estándar
Disponibles para todos los procesos
Los utilizan los programas como entrada y salida por
defecto.
Entrada
sort < fichero
Salida
ls
ls
ls
ls
Dispositivos estándar de los procesos
entrada estándar
salida estándar
salida de error
stdin
ú
-l
-l
kk
kk
> listado
>> listado
2> listado_errores
. > todo 2>&1
ÿ
stdout
stderr
Encadenamiento (pipeline)
du | sort -n
ÿ
Composición de comandos
Sistema de archivos en UNIX
• Archivos ¿Qué son?
Secuencial: date ; who
- Información asociada a un nombre
Paralelo: date & who
- Considerada como una serie de bytes:
Agrupamiento:
(sleep 5; date) & date
(date ; who) | tee espia | wc
(cd / ; ls) | wc -l
+ Caracteres ASCII
Continua si no falla:
grep -i amor poema > temp && wc temp
Continua si falla
grep -i amor poema > temp || rm temp
+ Código máquina
- Almacenados en un disquete, disco duro, o CD
• Tipos de archivos
1. Ordinarios
- Contienen una serie de bytes (ASCII, binarios, ambos)
- Estructura interna definida por el usuario
2. Directorios
3. Especiales periféricos, (descriptores)
- De carácter, de bloque, fifo ...
- Se encuentran dentro del directorio /dev
4
Creación de archivos
Nombres de los archivos
• Cada archivo, comprendidos los directorios y los archivos especiales,
es referenciado por un nombre
• Pueden ser creados por:
- un editor (ed, vi, emacs, ex ......)
- la redirección de la salida estándar de un programa
• Características del nombre:
- 14 caracteres de longitud máxima (sistema V) o 255 (BSD 4.x)
$ ls -l tarea* > salida.txt
- Puede contener cifras y letras (minúsculas y/o mayúsculas)
- algunos comandos (cp, sort, cc, mkdir)
• La administración de los archivos es efectuada por UNIX y es
totalmente transparente al usuario
- El primer caracter no puede ser: - + =
- No se aconsejan los caracteres especiales, salvo: . , _ • Ejemplos:
passwd
test-temp archivo_viejo .cshrc source.c cb.027-01
• Los archivos son generalmente escritos sobre disco
• Utilizar convenciones para los nombres de los archivos
• Cada archivo está asociado con al menos un nombre
Directorios
• Archivos “invisibles”: empiezan con .
Directorios comunes
• Permiten organizar el sistema de archivos
/bin
contiene los principales comandos
• Referenciados por su nombre, (como los otros archivos)
/etc
contiene los comandos y los archivos utilizados para el
mantenimiento y administración del sistema
/lib
contiene librerías y programas de los compiladores
• Contienen dos tipos de información
- El nombre del archivo
- El número de bloque de control (i-nodo)
• El directorio contiene estas informaciones para todos los archivos,
otros directorios, y/o archivos especiales que se encuentran a nivel
inferior
• Cada directorio es creado con dos entradas:
- "."
una referencia a él mismo
/tmp contiene los archivos temporales. Los usuarios pueden usarlo
como zona de trabajo
/dev contiene los archivos especiales de descripción de periféricos
/usr
Contiene los comandos locales, algunas librerías, los comandos
usuarios, los archivos de los correos, etc. Los directorios de los
usuarios pueden encontrarse en este directorio
/usr/bin contiene los comandos complementarios
- ".." una referencia a su padre
• Cuando se entra al sistema ("loguearse"), UNIX posiciona al usuario
en un directorio: es el directorio HOME
/usr/lib contiene las librerías y los programas suplementarios.
También contiene los programas de administración de las
impresoras y comunicación
/home los directorios de los usuarios pueden encontrarse dentro de
sistemas de archivos separados
El directorio HOME
Acceso a archivos en UNIX
• Cada usuario tiene un directorio HOME
• Cada archivo es referenciado por su camino de acceso (pathname)
formado por:
• Directorio creado por el administrador del sistema, generalmente es
creado dentro del directorio /usr, o /home
• Después del "login:" el usuario se encuentra dentro de este directorio,
(que se convierte en su directorio de trabajo)
- un nombre o una sucesión de nombres
- separados por "/"
- terminado por el nombre del archivo o directorio deseado
• Normalmente, el usuario trabajará en los directorios que se encuentran
dentro del directorio HOME
• Para posicionarse en él basta con teclear:
• Una forma de accesarlo desde cualquier directorio es a través del
caracter "~", por ejemplo:
Se indican todos los directorios necesarios para acceder a un
archivo
$ /home/jossan/practicas/P1/practica1.c
$ pwd
2. relativo
/home/jossan/pruebas
$ cp ~/practica1/*.c .
• Existen dos formas de especificar un camino de acceso
1. absoluto
$ cd <ret>
o bien
$ cp $HOME/practica1/*.c .
Referido al directorio de trabajo actual
$ practicas/P1/practica1.c
5
Listado del contenido de un directorio
Listado del contenido de un directorio
• ls despliega los nombres de los archivos que se encuentran dentro del
directorio actual,
• Sintaxis: ls [opciones]
• Ejemplo:
$ ls -l
total 4
• Algunas opciones:
-a lista los archivos que comienzan con un "."
-l listado en formato largo
d r w x r - x r - x 2 jossan isa
4096 Feb 12 20:13 mail
d r w x r - x r - x 2 jossan isa
4096 Dec 11 12:43 posix
- r w x r - x r - x 1 jossan isa
-s da el tamaño de los archivos en kilo-bytes
240 Feb 15 19:57 prueba.c
- r w - r - x - - x 1 jossan isa 11668 Feb 12 20:14 zz
-u despliega la última hora de acceso en lugar de la última hora de
modificación
$
-t lista los archivos en función de la hora de la última modificación
• Nota: las opciones pueden estar mezcladas:
$ ls -altr
ÿ
Listado del contenido de un directorio
Comandos útiles con archivos
• Despliega la siguiente información:
- more
• despliega el contenido de un archivo parándose entre cada
- El tipo de archivo:
-
normal
d
directorio
c
especial (periférico en modo carácter)
$ more .cshrc
- cat
- Los permisos de acceso de los archivos:
r
lectura
w
escritura
x
ejecución
-
acceso no permitido
pantalla
• Ejemplo
• copia uno o varios archivos hacia la salida estándar
• Ejemplo
$ cat archivo.txt
- pwd
print name of working directory
- Número de enlaces
• despliega el camino de acceso del directorio actual.
- Propietario y grupo
• Ejemplo:
- Tamaño
$ pwd
- Fecha y hora de la última modificación
/home/jossan/practicas/P1
- Nombre del archivo o directorio
La entrada y salida estándar
La entrada y salida estándar
• Cuando se realiza una conexión a un sistema UNIX tres archivos son
abiertos:
• Algunos comandos no leen sus argumentos de la entrada estándar sino
de uno o más archivos
1. Entrada estándar, (stdin): el teclado por donde se teclean los
comandos
2. Salida estándar, (stdout): la pantalla donde son desplegados los
resultados de los comandos
• Ejemplo:
$ cat arch1 arch2
lee los archivos "arch1" y "arch2", desplegando su contenido en la
salida estándar.
3. Salida de errores, (stderr): la pantalla donde son desplegados los
errores eventuales
• Un número, (el descriptor de archivo), es asignado a cada archivo:
• 0: entrada estándar
stdout
• 1: salida estándar
cat
stdin
• 2: salida de errores
stderr
stdout
stdin
UNIX
stderr
arch1
arch2
6
Redirección de las E/S estándar
Redirección de la entrada estándar
El shell permite redireccionar las entradas/salidas estándar:
<
$mail profesor < tarea.txt
redirección de la entrada estándar.
La entrada estándar será el archivo " tarea.txt "
> redirección de la salida estándar (creación)
>> redirección de la salida estándar (añadir/agregar)
La redirección de la salida de error depende del shell.
bshell
stderr
cshell
mail
2> redirección de la
>& redirección de la salida estándar
salida de error
stdin
y de error
stdout
2>&1 redirección de la
No existe opción para redirecccionar
salida estándar y de error
sólo la salida de error.
/usr/spool/mail/profesor
tarea.txt
a la salida estándar
Redirección de la salida estándar
Redirección de la salida estándar
$cat arch1 arch2 > final.txt
$echo ERRORES DE COPIA >> log
- Los archivos "arch1" y "arch2" serán copiados uno después del
otro en el archivo "final.txt"
- La salida estándar del comando echo será el archivo "log"
- Si el archivo ya existe, se añadirá el resultado del comando echo al
final de dicho archivo
- La salida estándar de cat es "final.txt"
stderr
stderr
cat
mail
stdin
stdin
stdout
stdout
final.txt
log
arch1
arch2
Restricciones de la redirección
Ejecución de comandos secuenciales
• Es posible teclear diferentes comandos sobre la misma línea,
separandolos por punto y comas " ; "
¿Existe el archivo?
SI
• Los comandos son ejecutados secuencialmente, es decir que el
segundo comando es ejecutado después de que el primero terminó
su ejecución
NO
<
lee el archivo
error
>
error
creación del
archivo
Wed Oct 12 10:44:16 MET 1986
>>
añadirlo al final
del archivo
error
rgomez
console
Oct 12 09:09
rgomez
ttyp0
Oct 12 10:38
toto
ttyp1
Oct 12 11:08
$ date; ls ;
prueba
who
archivo
ÿ
7
Pipelines
Ejecución en background
• La salida estándar de un comando puedo ser conectada a la entrada
estándar de otro comando
• Concepto de job en cshell: Cuando se teclea un comando se le
asigna un número de job.
• Evita la creación de archivos temporales
• Para los comandos lentos en su ejecución resulta interesante poder
disponer de la terminal, de tal forma que se pueda ejecutar otros
comandos..
$ cat nombres | grep maquina | more
• Poniendo un " & " después de la línea de comando, éste se ejecutará
en background, de una forma sincrónica
stdout
stderr
% netscape tareas.html -display walhalla: 0.0 &
[1] 712
cat
grep
more
1
es el número de job
712
identificador del proceso
• Para regresarlo a foreground se usa el comando fg seguido del
número de job
nombres
stdin
Agrupación de comandos
• Si se agrupan varios comandos entre "( )" o "{ }", estos seran
considerados como una sola unidad
%fg %1
Comandos UNIX
- cd
• cambio de directorio
• cd sin nombre lo posiciona en el directorio HOME
• Esto es interesante para la redirección de entradas y salidas
$ cd tareas
Los siguientes comandos:
$ echo El dia de hoy: > log
- mkdir
• creación de directorios
$ date >> log
$ echo las personas siguientes >> log
$mkdir /usr/usr2/alumno1
- rmdir
$ who >> log
• eliminación de directorios
$ echo se encuentran conectadas >> log
• rmdir no borrará el directorio si este no se encuentra vacío
$rmdir tareas
pueden agruparse en uno solo:
$ ( echo El dia de hoy; date; echo las personas \
siguientes; who; echo se encuentran conectadas ) > log
Comandos UNIX
- date
Comandos UNIX
- cp
• Despliega la fecha y la hora
• copia un archivo ordinario con otro nombre o a un directorio
$ date
$ cp arch1 arch2
Mon Oct 10 15:58:58 MET 1988
$ cp arch1 direc
• La impresión del comando date puede ser reformateada
- who
$ cp arch1 direc/arch2
$ cp arch1 arch2 arch3 direc
• Despliega los usuarios conectados
$who
• cp no modifica los archivos originales, tan solo los duplica
-mv (move)
guimen
console Feb 10 09:48
rgomez
ttyp0
Feb 10 11:18
$ mv arch-a arch-b
jossan
ttyp1
Feb 10 12:54
$ mv direc1 direc2
• Una variante es whoami que despliega información
correspondiente a la persona conectada a la terminal donde se
tecleo ese comando
• desplaza un archivo o lo renombra
$ mv arch1 arch2 arch3 arch4 direc
$ mv arch1 ../bin/fx
8
Comandos UNIX
Comandos UNIX
- ln (link)
- ln (link)
• crea un nuevo nombre para un archivo, (útil para archivos sistemas,
evitar copiar dos archivos con el mismo nombre => ahorrar espacio )
• En BSD 4.x es posible crear enlaces simbólicos entre archivos o
directorios correspondientes a sistemas de archivos diferentes
• solamente con la opción -s se puede cambiar el nombre a un directorio
$ ls
$ ls -li /* listado largo con i-node */
arch1 dir1
total 2
$ ln -s arch1 fichero
14411 -rw-r--r-- 1 rgomez
412 Oct 10 16:56 arch1
14412 -rw-r--r-- 1 rgomez
167 Oct 10 16:57 archivo
$ ln -s dir1 fuentes
$ ls -li
$ ln arch1 fichero
total 4
$ ls -li
14411 -rw-r--r--
total 3
14411 -rw-r--r-- 2 rgomez
1 rgomez 412 Oct 10 16:56 arch1
14412 lrwxrwxrwx 1 rgomez
412 Oct 10 16:56 arch1
14411 -rw-r--r-- 2 rgomez
412 Oct 10 16:56 fichero
14412 -rw-r--r-- 1 rgomez
167 Oct 10 16:57 archivo
4 Oct 10 17:09 fichier -> arch1
38935 drwxr-xr-x 2 rgomez 512 Oct 10 17:09 dir1
14413 lrwxrwxrwx 2 rgomez
Comandos UNIX
4 Oct 10 17:10 fuentes -> dir1
Otros comandos
- rm (remove)
- ps
• borra el nombre de un archivo
• listado de los procesos que se están ejecutando
• si ese nombre fuera el último (numero de enlaces = 1), el archivo será
"físicamente" suprimido
$ rm arch1
• Opciones:
- lpr
• crea un trabajo de impresión en el área de spooling para su posterior
impresión
- lpq
-r recursivamente (si directorio contiene otro, borra contenido de
este)
• permite ver el estado de las colas de espera de impresión
- lprm
-f forzado (no despliega errores, ni hace preguntas)
• permite suprimir archivos en espera de ser impresos
-i interactivo (pregunta)
- grep
- echo
• permite encontrar patrones en archivos
• imprime sus argumentos sobre la salida estándar (la pantalla por default)
$ echo prueba del comando echo
prueba del comando echo
- sort
• permite ordenar las lineas de un archivo de texto
ÿ
Otros comandos
- wc
• cuenta líneas, palabras y caracteres
Categorías de usuarios en UNIX
En UNIX el acceso a los archivos y directorios se diferencia en
función de tres categorías de usuarios:
- tail
• muestra las últimas líneas de un archivo
- head
• muestra las primeras líneas de un archivo
1. Propietario
• El propietario del archivo
• En principio se refiere al que creó el archivo
- uname
• despliega información acerca del sistema en el que se está trabajando
- tty
• identifica el terminal de usuario
2. Grupo
En principio se refiere al grupo al cual pertenece el creador del
archivo
3. Otros
El resto del mundo
9
Autorización de acceso a archivos
Cambio de la autorización de acceso
+ A través de ls -l podemos ver las autorizaciones de los archivos:
• El comando chmod permite modificar las autorizaciones de acceso de
los archivos y de los directorios ya creados
r
w x
r w x
r w x
0 0 0
0 0 0
0 0 0
...
...
...
1 1 1
1 1 1
1 1 1
propietario
grupo
otros
• Existen dos formas de especificar el nuevo modo:
+ en octal:
chmod ooo archivo
+ en modo simbolico:
chmod [ ugoa ] [+ = -] [ rwx ]
u permisos del usuario
g permisos del grupo
+
archivos
r
autorización de
directorios
lectura
lectura
w autorización de
escritura
escritura (creación,
modificación o supresión)
x autorización de
ejecución
acceso
o permisos de los otros
a todos los permisos
Llamadas al sistema
Llamadas al Sistema
Sistema de ficheros:
open, creat
close
read, write
lseek
unlink
Gestión de procesos
Comunicación entre procesos
señales
fork, exec, exit, wait
signal, kill
pipes, fifos
IPC (Inter Process Communication)
colas de mensajes
semaforos
segmentos de memoria compartida
Creación de Procesos
Creación de Procesos
ejemplo:
#include <sys/types.h>
#include <unistd.h>
main()
{
int pid;
printf(“Before fork\n”);
pid= fork()
if (pid==0)
printf(“child process\n”);
else if (pid > 0)
printf(“parent process\n”);
else
perror(“Fork returned error:\n”);
pid_t fork(void );
fork() devuelve 0 al hijo y el ID del hijo al padre.
}
Fork crea una segunda instancia del mismo proceso. El código de programa
así como las variables son las mismas en ambos procesos.
before fork
after fork
PC
pid = fork0
if (pid == 0)
parent
process
PC
pid = fork0
if (pid == 0)
parent process
pid = child's pid
PC
pid = fork0
if (pid == 0)
pid = 0
10
Ejecución de programas
Ejecución de programas
Familia de llamadas al sistema “exec”
La llamada exec carga un nuevo programa en el espacio de
memoria del proceso que llama.
El programa viejo es sustituido por el nuevo
Secuencia de llamadas fork, exec, wait, exit
program a
program a
wait
program a
continues
afterr exit of
program b
fork
copy of program a
exec
program b
exit
usage of wait
and exit:
Espera de finalización de procesos
path:
file:
child = fork ( ) ; /*PID de un nuevo proceso */
if (child>0) {
/* El código del padre*/
}else if (child == 0){
/* aquí va el código del hijo */
execl ( “/usr/bin/ls“, ”ls“, “-l”, NULL);
perror ( “fallo en execl “);
/* en caso de error en execl */
exit (1);
}else{
/* en caso de error en fork */
perror(“fallo en fork()”);
exit(2);
}
/* aquí continúa el padre */
wait() devuelve el ID de dicho hijo y de lo contrario devuelve –1.
Como argumento, devuelve un puntero al status (causa) de su
finalización.
#include <unistd.h>
int dup(int fd);
/* devuelve el descriptor más pequeño
disponible y lo asocia al mismo archivo que el
descriptor fd */
int dup2(int fd0, int fd1);
/* asocia al descriptor fd1 el mismo
archivo que está asociado a fd0 */
debe ser un programa ejecutable
puede ser un programa ejecutable o un shell script
Ejemplo
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait (int*status);
pid_t waitpid (pid_t which, int *status, int option);
Redireccionamiento
pid = wait(&status)
exit(status)
Int execl(const char *path, const char *arg0, ...,
const char *argn, char * /* NULL */);
Int execle(const char *path, char *const arg0[], ...,
const char *argn, char * /* NULL */,
char *const envp[]);
Int execlp(const char *file, const char *arg0, ...,
const char *argn, char * /* NULL */);
Int execv(const char *path, char *const argv[]);
Int execvp(const char *file, char *const argv[]);
Int execve(const char *path, char *const argv[], char *const envp[]);
Tuberías sin Nombre : pipe
#include <unistd.h>
int pipe(int fd[2]);
fd[0] estará asociado al extremo de lectura
fd[1] estará asociado al extremo de escritura
11
Tuberías sin Nombre: pipe
ý
ûüý øø ù ý ú
ø
ø
ø ÿù ø ø
ÿ øø
ø
øøø
øø
øø ø
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *path, mode_t mode);
ø ý øøø øý ù
øø
ú
øøø
øøø
øøø
ø
ø
ü
øø
øøø
øøø
Tuberias con Nombre: FIFO
ú ùøý øû ø ü
øø øø
ú ø ø
ýø ø ú ø øø ø
ú
ú ø ø ú
ø
ü øý øû ø ü
ø
ø
A
B
A
B
øø
øø ýø
øøø ûúù
øøø ý
øøø
ø øø ø ø ú ùúø úø
øø ø
ø ûø
ÿúøý ø ù
ø ü ø
ûø úøû ø ù øøý øû ø ü
ø ýø ø
øøø ûúù
øøø
ø
øø ø ø ú ùúø ý ø
øø ø
ø ûø
ÿúøý øû
øÿù ø
ü ø
ø
ü
ü ø
Envío de Señales
Máscara y Conjunto de Señales
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig)
#include <signal.h>
raise(SIGUSR1);
Espera de Señales
#include <signal.h>
sigemptyset(sigset_t *set);
sigfillset(sigset_t *set);
sigaddset(sigset_t *set , int signo);
sigdelset(sigset_t *set , int signo);
sigismember(const sigset_t *set , int signo, int signo);
Identificación de canales IPC
#include <unistd.h>
int pause(void);
#include <sys/types.h>
#include <sys/ipc.h>
#include <unistd.h>
int sigsuspend(const sigset_t *sigmask);
key_t ftok(const char *path, int id);
ÿ
12
Colas de mensajes
Semáforos
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int msgget(key_t keym, int msgflg);
void msgsnd(int msgid, struct msgbuf *ptr, int length, int flag);
int msgrcv(int msgaid, struct msgbuf *ptr, int length, long msgtype, int flag);
int msgctl(int msgid, int cmd, struct msgid_ds *buf);
int semget(key_t key, int nsems, int semflg);
int semop (int semid, struct sembuf *sops, int nsops);
int semctl (int semid, int semnum, int cmd, ...);
Memoria Compartida
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/smh.h>
int shmget(key_t keym int size, int shmflg);
void *shmat(int shmid, void *shmaddr, int shmflg);
int shmdt(void *shmaddr);
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
Sistema Operativo UNIX
13
Descargar