Sunteți pe pagina 1din 16

Fundamentos de Ordenadores

y Sistemas Operativos

Tema
Comunicacin entre
procesos

Introduccin
La comunicacin entre procesos habilita mecanismos para que
los procesos puedan intercambiar datos y sincronizarse
Con seales podramos comunicar procesos, pero su uso debe
limitarse a la comunicacin de eventos o situaciones excepcionales
Consideramos dos situaciones:
Los procesos se ejecutan en una misma mquina
Tuberas (pipes) y FIFOs
Mecanismos IPC (Inter-Process Communication)
Semforos
Memoria compartida
Colas de mensajes
Los procesos se ejecutan en mquinas diferentes

sockets

Previamente: llamadas al sistema sobre ficheros

open()
Abre un fichero.
#include
#include
#include
#include
#include

<stdio.h>
<stdlib.h>
<sys/types.h>
<sys/stat.h>
<fcntl.h>

int open(char *ruta, int modo, int permisos);


int open(char *ruta, int modo);
devuelve -1 en caso de error y el descriptor del fichero (>2) en caso de xito (recuerde que los
valores 0, 1 y 2 estn reservados a los descriptores de entrada estndar, salida estndar y salida
estndar de errores).
modo :
O_RDONLY: Apertura en modo slo lectura.
O_WRONLY: Apertura en modo slo escritura.
O_RDWR: Apertura en modo lectura/escritura.
O_CREAT: Indica que se debe crear el fichero si no existe, y si existe se usa.
O_EXCL: Esta bandera siempre va de la mano de O_CREAT, por s sola no tiene significado.
Cuando se emplea junto a O_CREAT cambia su significado de manera que si el fichero existe, la
funcin open devuelve error.
O_TRUNC: Si ya existe el fichero, pone su contenido a cero. Es decir, lo borra

Previamente: llamadas al sistema sobre ficheros

read()
Lee desde un fichero.

int read(int fd, void *buf, int tambuf);


Los parmetros de esta funcin son:
fd : es el descriptor de fichero, obtenido con open().
buf : es el lugar en el que se almacena la informacin leda del fichero.
tambuf: es el tamao del buffer.
Esta llamada devuelve -1 en caso de error, mayor que 0 indica el nmero de bytes ledos e
igual a 0 para indicar final de fichero.

write()
Escribir en un fichero .

int write(int fd, void *buf, int bytes_a_escribir);


Dicha llamada que devuelve -1 en caso de error, y >0 indicando el nmero de bytes escritos en caso de
xito. Esta llamada toma los siguientes parmetros:
fd: el descriptor de fichero obtenido mediante open()
buf: puntero a un buffer que contiene la informacin que se quiere escribir en el fichero.
bytes_a_escribir: el nmero de bytes que hay en el buffer que se quieren escribir en el fichero (ojo!
puede ser menor que tamao del buffer, recuerda no usar sizeof aqu!).

close()
Cierra un fichero.

int close (int fd);

Previamente: llamadas al sistema sobre ficheros

dup2()
Genera un duplicado de un descriptor existente, tiene el siguiente prototipo:

int dup2(int fd1, int fd2);


Esta funcin devuelve -1 en caso de error. En caso de xito, el descriptor fd2 pasa a ser un
duplicado del descriptor fd1.

Cmo funciona dup2

dup2(fd, STDOUT_FILENO);
dup2 genera el duplicado, de manera que el descriptor 1
(STDOUT_FILENO) ya no apunta a la pantalla sino al fichero
resultados.txt de descriptor fd
entrada estndar
0
resultados.txt
1
salida estndar de errores (pantalla)
2

.
fd

resultados.txt

De esta manera, cuando invoquemos a printf el mensaje que se pase


como parmetro no se imprimir en pantalla, sino que se almacenar en
el fichero datos.txt

Tuberias

El mtodo ms bsico para comunicacin


entre
procesos
Creacin de una tubera sin nombre
#include <stdio.h>
int pipe (int fdes[2]);
pipe() crea una tubera donde:
fdes[0] es un descriptor de un fichero de slo lectura
de la tubera
fdes[1] es un descriptor de un fichero de slo
escritura en la tubera
Lo que se escribe en fildes[1] se lee en fildes[0]

Tuberias

Ventaja: fcil manejo de la tubera


(mismo tratamiento que un fichero: read,
write, close)

Limitaciones:

Solo permiten comunicaciones de tipo


half duplex
Slo pueden ser usadas entre procesos
relacionados (parentesco)

Tuberias
Normalmente, un proceso crea una tubera y luego
ejecuta la llamada fork
Los descriptores de fichero se heredan de padres
a hijos

En general, despus de fork y pipe:


El proceso de lectura cierra el lado de escritura de la
tubera
El proceso de escritura cierra el lado de lectura de la
tubera
A continuacin suele venir el intercambio de datos
(operaciones de lectura y escritura)
Y finalmente el proceso de cierre

Esquema de comunicacin con tubera

Tuberias
int n, fdes[2];
pid_t pid;
char line[MAXLINE];
if (pipe(fdes) < 0) exit(1);
if ((pid=fork()) == 0)
{
close(fd[1]);
n = read(fdes[0],line,MAXLINE);
write(STDOUT_FILENO, line, n);
}
else if (pid>0) {
close(fdes[0]);
write(fdes[1], hello son\n,10);
}
else
exit(1);

Tuberias
La tubera usa un buffer gestionado por el ncleo
La sincronizacin entre los accesos de
escritura y lectura la lleva a cabo el ncleo
Cuando el buffer est lleno, la llamada write se
bloquea
Cuando el buffer est vaco, la llamada read se
bloquea
Tambin es el ncleo el encargado de

gestionar la tubera segn una poltica FIFO


Si se intenta escribir cuando el extremo lector ha
cerrado se genera la seal SIGPIPE
Cuando se cierra el extremo escritor, se recibe
un EOF tras la recepcin de los ltimos datos

Tuberias

Ejercicio prctico:
Vamos a crear un proceso padre que se
encargue de leer mensajes de la entrada
estndar y se los pase a un proceso hijo que
los presentar por pantalla. El ciclo
terminar cuando el padre enve la cadena
FIN al proceso hijo

Esquema de comunicacin bidereccional


con tuberas
Problema: las tuberas crean comunicaciones
unidireccionales Cmo crear bidireccionalidad?

Esquema de comunicacin bidereccional


con tuberas

FIFOS
Permiten comunicacin entre dos procesos
cualesquiera, entre los que no hay relacin de parentesco
Son un tipo especial de fichero, con una
entrada en un directorio

Son persistentes, es decir, existen en el sistema de archivos

Tambin se conocen como tuberas FIFO (First In First


Out)
Creacin de una tubera con nombre
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo (const char *pathname, mode_t mode);
donde:
pathname: ruta de la tubera con nombre que se va a crear
mode: mscara de permisos

FIFOS

Equivalente a las operaciones sobre ficheros


open, close, unlink, read y write

Con algunas diferencias

Apertura bloqueante
open(fifo_ejemplo,O_WRONLY) => el proceso escritor se
bloquea hasta hasta que no haya otro proceso que abra la tubera
para leer de ella
open(fifo_ejemplo,O_RONLY) => el proceso lector se
bloquea hasta que no haya otro proceso que abra la tubera para
escribir en ella

Esto es as a menos que se indique en la apertura el


modificador O_NONBLOCK:

Un open de solo lectura retorna inmediatamente


Un open de solo escritura retorna un error sii ningn proceso
tiene la FIFO abierta para lectura

S-ar putea să vă placă și