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