240 likes | 404 Vues
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/~elo321. La forma de crear procesos en *NIX es invocar la llamada al sistema for k.
E N D
Teoría de Sistemas OperativosSincronización: señales Departamento de Electrónica 2º Semestre, 2003 Gabriel Astudillo Muñoz http://www.elo.utfsm.cl/~elo321
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
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
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); • }
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()
int kill(pid_t pid, int signal); • permite enviar una señal a un proceso argumentos: • pid • señal • ejemplo: • kill(340,SIGINT)
signal() • Indica la función que debe ejecutarse al recibir una señal. • argumentos: • Tipo de señal • función • ejemplo • signal(SIGINT,prueba)
int kill(pid_t pid, int signal); • Ejemplo: • ejemplo04_signal/
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();
Función popen: • Crea una pipe • Crea otro procesos y lee o escribe de la pipe • Uso • #include <stdio.h> • FILE *popen (const char *command, const char *type);
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)
Función pclose(*stream): • 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)
Una pipe puede creada con la función pipe • La función pipe provee una comunicación unidireccional para el flujo de datos: • Uso: • #include <stdio.h> • int pipe(int fd[2]);
La función pipe retorna 2 descriptores de archivo: • fd[0] : para lectura • fd[1] : para escritura
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:
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
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
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);
Ayuda en Línea: • http://manuales.elo.utfsm.cl sección “Manuales en Línea” • En línea de comandos: $ info libc