señales

Anuncio
Sistemas de Computación
Sincronización: Señales
2º Semestre, 2008
José Miguel Rubio L.
jose.rubio.l@ucv.cl
http://www.inf.ucv.cl/~jrubio
Procesos y Señales
Creación
Señales
La forma de crear procesos en
*NIX es invocar la llamada al sistema
fork.
Pipes
Fifos
El proceso que invoca a fork es llamado
proceso padre, y el nuevo proceso
creado es llamado proceso hijo
2
Procesos y Señales
Creación
Señales
Pipes
Fifos
Sintaxis y Uso:
#include<sys/types.h>
#include <unistd.h>
pid_t fork(void);
pid = fork();
Retorno:
• 0 en hijo
• Identificador de hijo en el padre
• -1 en caso de error
3
Procesos y Señales
Creación
Señales
Pipes
Fifos
int main(void) {
pid_t pid,p_pid;
pid = fork();
switch (pid) {
case -1:
printf ("error\n"); exit(1); break;
case 0:
printf("Proceso hijo:PID mio: %d,
PID padre: %d\n",
getpid(), getppid());
break;
default:
printf("Proceso padre: PID mio: %d,
PID hijo: %d, PID padre %d\n",
getpid(), pid, getppid());
}
exit(0);
}
4
Procesos y Señales
Creación
Señales
Pipes
Fifos
Las señales informan a los procesos de la
ocurrencia de un evento asincrónico
Los procesos pueden enviarse señales a
través de la llamada al sistema kill o el kernel
puede enviarlas directamente
Funciones clave:
• kill()
• signal()
5
Procesos y Señales
Creación
int kill(pid_t pid, int signal);
Señales
Pipes
Fifos
permite enviar una señal a un proceso
argumentos:
• pid
• señal
ejemplo:
• kill(340,SIGINT)
6
Procesos y Señales
Creación
signal()
Señales
Pipes
Fifos
Indica la función que debe ejecutarse al
recibir una señal.
argumentos:
• Tipo de señal
• función
ejemplo
• signal(SIGINT,prueba)
7
Procesos y Señales
Creación
Señales
Pipes
int kill(pid_t pid, int signal);
Ejemplo:
ejemplo04_signal/
Fifos
8
Procesos y Señales
Creación
Señales
Pipes
Fifos
9
Procesos y Señales
Creación
Señales
Pipes
Fifos
Proveen
una interfaz para comunicar
procesos
Redirecciona
la salida de un comando hacia
la entrada del otro
STDOUT de un proceso al STDIN de otro
Ej. % ls -las l grep prueba
Funciones
claves: popen(), pclose();
10
Procesos y Señales
Creación
Señales
Pipes
Función popen :
• Crea una pipe
• Crea otro procesos y lee o escribe de
la pipe
Fifos
Uso
#include <stdio.h>
FILE *popen (const char *command,
const char *type);
11
Procesos y Señales
Creación
Señales
Pipes
Fifos
Se crea una pipe entre el proceso que invoca
la función y el comando especificado
Según el valor de type
type = r : el proceso que invoca a popen lee
desde la pipe, es decir, de la salida de
command (su STDOUT)
type = w: el proceso que invoca a popen
escribe a la pipe, es decir, en la entrada de
command (su STDIN)
12
Procesos y Señales
Creación
Función pclose(*stream):
Señales
Pipes
Fifos
Cierra
el flujo (stream) de I/O que fue
creada por popen (la pipe)
Espera a que termine el comando
(command)
Retorna el status del shell (que ejecutó el
comando)
13
Procesos y Señales
Creación
Señales
Pipes
Fifos
14
Procesos y Señales
Creación
Señales
Una
pipe puede creada con la función pipe
La función pipe provee una comunicación
unidireccional para el flujo de datos:
Pipes
Fifos
Uso:
#include <stdio.h>
int pipe(int fd[2]);
15
Procesos y Señales
Creación
Señales
Pipes
La función pipe retorna 2 descriptores de
archivo:
• fd[0] : para lectura
• fd[1] : para escritura
Fifos
16
Procesos y Señales
Creación
Señales
Pipes
En general, la pipe se utiliza para comunicar
2 procesos (padre e hijo)
La pipe con los 2 procesos se visualiza de la
siguiente manera:
Fifos
17
Procesos y Señales
Creación
Señales
Pipes
Fifos
Para realizar la comunicación entre el padre y el hijo
se debe realizar:
• El proceso padre crea una pipe
• Se llama a fork creando una copia del padre
• El proceso padre cierra la lectura de la salida
de la pipe
• El proceso hijo cierra la escritura a la entrada
de la pipe
18
Procesos y Señales
Creación
Señales
Pipes
Fifos
Para tener un flujo de datos bidireccional:
Crear pipe1 (fd1[0] y fd1[1]) y crear pipe2
(fd2[0] y fd2[1])
El padre cierra la lectura desde la salida de
la pipe1
El padre cierra la escritura a la pipe2
El hijo cierra la lectura desde la salida de la
pipe2
El padre cierra la escritura a la pipe1
19
Procesos y Señales
Creación
Señales
Pipes
Fifos
20
Procesos y Señales
Creación
Señales
Pipes
Fifos
FIFO
es similar a una pipe, establece un canal
unidireccional de comunicación entre 2 procesos no
relacionados
Una FIFO es creada por la función mkfifo.
int mkfifo(const char *pathname,
mode_t mode);
21
Procesos y Señales
Creación
Ejemplo Proceso “Receptor”
Señales
Pipes
Fifos
22
Procesos y Señales
Creación
Ejemplo Proceso “Transmisor”
Señales
Pipes
Fifos
23
Procesos y Señales
Creación
Señales
Ayuda en Línea:
En línea de comandos:
$ info libc
Pipes
Fifos
24
Descargar