html5-img
1 / 24

Teoría de Sistemas Operativos Sincronización: señales

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.

dawn-bryan
Download Presentation

Teoría de Sistemas Operativos Sincronización: señales

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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

  2. 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

  3. 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

  4. 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); • }

  5. 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()

  6. int kill(pid_t pid, int signal); • permite enviar una señal a un proceso argumentos: • pid • señal • ejemplo: • kill(340,SIGINT)

  7. signal() • Indica la función que debe ejecutarse al recibir una señal. • argumentos: • Tipo de señal • función • ejemplo • signal(SIGINT,prueba)

  8. int kill(pid_t pid, int signal); • Ejemplo: • ejemplo04_signal/

  9. 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. 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);

  11. 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. 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)

  13. 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]);

  14. La función pipe retorna 2 descriptores de archivo: • fd[0] : para lectura • fd[1] : para escritura

  15. 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:

  16. 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

  17. 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

  18. 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);

  19. Ejemplo Proceso “Receptor”

  20. Ejemplo Proceso “Transmisor”

  21. Ayuda en Línea: • http://manuales.elo.utfsm.cl sección “Manuales en Línea” • En línea de comandos: $ info libc

More Related