Teora de Sistemas Operativos Sincronizacin seales Departamento de

  • Slides: 24
Download presentation
Teoría de Sistemas Operativos Sincronización: señales Departamento de Electrónica 2º Semestre, 2003 Gabriel Astudillo

Teoría de Sistemas Operativos Sincronización: señales Departamento de Electrónica 2º Semestre, 2003 Gabriel Astudillo Muñoz http: //www. elo. utfsm. cl/~elo 321

Procesos y Señales Creación Señales Pipes Fifos La forma de crear procesos en *NIX

Procesos y Señales Creación Señales Pipes Fifos La forma de crear procesos en *NIX es invocar la llamada al sistema fork. 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.

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

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 ("errorn"); exit(1); break; case 0: printf("Proceso hijo: PID mio: %d, PID padre: %dn", getpid(), getppid()); break; default: printf("Proceso padre: PID mio: %d, PID hijo: %d, PID padre %dn", getpid(), pid, getppid()); } exit(0); } 4

Procesos y Señales Creación Señales Pipes Fifos Las señales informan a los procesos de

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 Señales Pipes Fifos int kill(pid_t pid, int signal); permite enviar

Procesos y Señales Creación Señales Pipes Fifos int kill(pid_t pid, int signal); permite enviar una señal a un proceso argumentos: • pid • señal ejemplo: • kill(340, SIGINT) 6

Procesos y Señales Creación Señales Pipes Fifos signal() Indica la función que debe ejecutarse

Procesos y Señales Creación Señales Pipes Fifos signal() 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: ejemplo 04_signal/

Procesos y Señales Creación Señales Pipes int kill(pid_t pid, int signal); Ejemplo: ejemplo 04_signal/ Fifos 8

Procesos y Señales Creación Señales Pipes Fifos 9

Procesos y Señales Creación Señales Pipes Fifos 9

Procesos y Señales Creación Señales Pipes Fifos l. Proveen una interfaz para comunicar procesos

Procesos y Señales Creación Señales Pipes Fifos l. Proveen una interfaz para comunicar procesos l. 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 l. Funciones claves: popen(), pclose(); 10

Procesos y Señales Creación Señales Pipes Función popen : • Crea una pipe •

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

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 = 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 Señales Pipes Fifos Función pclose(*stream): l. Cierra el flujo (stream)

Procesos y Señales Creación Señales Pipes Fifos Función pclose(*stream): l. Cierra el flujo (stream) de I/O que fue creada por popen (la pipe) l. Espera a que termine el comando (command) l. 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 Pipes Fifos 14

Procesos y Señales Creación Señales Pipes Fifos l. Una pipe puede creada con la

Procesos y Señales Creación Señales Pipes Fifos l. Una pipe puede creada con la función pipe l. La función pipe provee una comunicación unidireccional para el flujo de datos: 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:

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

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

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:

Procesos y Señales Creación Señales Pipes Fifos Para tener un flujo de datos bidireccional: l. Crear pipe 1 (fd 1[0] y fd 1[1]) y crear pipe 2 (fd 2[0] y fd 2[1]) l. El padre cierra la lectura desde la salida de la pipe 1 l. El padre cierra la escritura a la pipe 2 l. El hijo cierra la lectura desde la salida de la pipe 2 l. El padre cierra la escritura a la pipe 1 19

Procesos y Señales Creación Señales Pipes Fifos 20

Procesos y Señales Creación Señales Pipes Fifos 20

Procesos y Señales Creación Señales Pipes Fifos l. FIFO es similar a una pipe,

Procesos y Señales Creación Señales Pipes Fifos l. FIFO es similar a una pipe, establece un canal unidireccional de comunicación entre 2 procesos no relacionados l. 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 “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 Ejemplo Proceso “Transmisor” Señales Pipes Fifos 23

Procesos y Señales Creación Señales Pipes Ayuda en Línea: lhttp: //manuales. elo. utfsm. cl

Procesos y Señales Creación Señales Pipes Ayuda en Línea: lhttp: //manuales. elo. utfsm. cl sección “Manuales en Línea” Fifos l. En línea de comandos: $ info libc 24