0% encontró este documento útil (0 votos)
462 vistas3 páginas

Tuberias - Pipes

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1/ 3

Alumno: Juarez Leonel Hector Daniel

Grupo: 2TM3
TEMA: PIPES
---En informtica, una tubera (pipe, cauce o '|') consiste en una cadena de
procesos conectados de forma tal que la salida de cada elemento de la cadena
es la entrada del prximo. Permiten la comunicacin y sincronizacin entre
procesos. Es comn el uso de buffer de datos entre elementos consecutivos.
La comunicacin por medio de tuberas se basa en la interaccin
productor/consumidor, los procesos productores (aquellos que envan datos) se
comunican con los procesos consumidores (que reciben datos) siguiendo un
orden FIFO. Una vez que el proceso consumidor recibe un dato, este se elimina
de la tubera.
Las tuberas (pipes) estn implementadas en forma muy eficiente en los
sistemas operativos multitarea, iniciando todos los procesos al mismo tiempo,
y atendiendo automticamente los requerimientos de lectura de datos para
cada proceso cuando los datos son escritos por el proceso anterior. De esta
manera el planificador de corto plazo va a dar el uso de la CPU a cada proceso
a medida que pueda ejecutarse minimizando los tiempos muertos.
Para mejorar el rendimiento, la mayora de los sistemas operativos
implementan las tuberas usando buffers, lo que permite al proceso proveedor
generar ms datos que lo que el proceso consumidor puede atender
inmediatamente.
Podemos distinguir dos tipos de tuberas:
- Tubera sin nombre: Las tuberas sin nombre tienen asociado un fichero en
memoria principal, por lo tanto, son temporales y se eliminan cuando no estn
siendo usados ni por productores ni por consumidores. Permiten la
comunicacin entre el proceso que crea un cauce y y procesos hijos tras las
creacin de la tubera.
- Tubera con nombre: Su diferencia respecto a las tuberas sin nombre radica
en que el cauce se crea en el sistema de archivos, y por lo tanto no tienen
carcter temporal. Sea mediante llamadas al sistema (open, close, read y
write) como el resto de ficheros del sistema. Permiten la comunicacin entre
los procesos que usen dicha tubera, aunque no exista una conexin
jerrquica entre ellos.
Pipes en Linux
-----------Pipes a nivel shell

Cuando en el shell de UNIX alguien escribe "gunzip -c zapato.tar.gz | tar xf -" lo


que sucede es lo siguiente:
1. El shell construye un pipe, que es un par de "archivos inexistentes", que
tienen la cualidad de que lo que se escribe en uno se lee en el otro.
2. Despus el shell crea dos procesos diferentes, uno con gzip y otro con tar.
Esos procesos son procesos completamente independientes y corren al mismo
tiempo, aprovechando la multitarea del sistema operativo. El proceso con el
gzip tiene redireccionada su salida estndar hacia uno de los "archivos
inexistentes" del pipe, y el otro "archivo inexistente" oficia como entrada
estndar para el tar.
Esto quiere decir que gzip y tar se ensamblan mgicamente en un nuevo
utilitario que descomprime y "desarchiva" al mismo tiempo.
Y cmo se usa todo esto en un programa?
Para usar pipes desde C slo hay que llamar a la funcin pipe y pedirle los dos
descriptores de archivo que sern los extremos del "tubo" que se habr
construido. Algo as:
int p[2];
pipe(p);
Despus de la invocacin a pipe el arreglo de enteros p contiene en p[0] un
descriptor de archivo para leer, y en p[1] un descriptor de archivo para escribir.
Esto quiere decir que los pipes funcionan en una sola direccin.
Cmo se usan estos descriptores de archivo que nos devolvi la funcin?
Bueno, se pueden usar para leer y escribir bytes mediante las funciones read,
write y close, pero usualmente es mucho ms conveniente crear un FILE* y de
esta manera poder usar funciones ms cmodas tales como fread, fwrite,
fprintf, etc. Esto se logra mediante la funcin fopen. Por ejemplo para leer de
p[0] podemos simplemente hacer FILE *f=fopen(p[0], "r+"), y ya disponemos
de un FILE* listo para leer los bytes que emergen del pipe. Para escribir (por
ejemplo en p[1]), se hace lo mismo pero se debe pasar como segundo
parmetro "w" (al igual que en un fopen normal).
Pipes y procesos hijo
Todo lo dicho hasta ahora muestra como usar un pipe dentro de un nico
proceso. Esto raramente tiene sentido. Un pipe pasa a ser ms til en el caso
de comunicar un proceso padre con un proceso hijo. Pero p[0] y p[1], cuando
son creados existen solamente en el proceso en el que fueron creados: esos file
descriptors son solamente vlidos all. El truco es aprovechar que la funcin
fork, que permite crear nuevos procesos, copia todo el proceso del llamador. Y
eso incluye a los file descriptors del pipe, pero... el pipe no se duplica! Y esto
2

da como resultado que si el padre escribe en p[1], el hijo puede leer en p[0], o
viceversa.
Un pipe sirve solamente para una comunicacin unidireccional, si es necesario
que padre e hijo se comuniquen en ambos sentidos, debern usarse dos pipes.
Al respecto, comenta Ramrez (2016), Si el pipe es para que el padre escriba en
p[1] se recomienda que cierre p[0] (y que el cliente cierre p[1]). Es decir que
cada parte cierre el extremo del pipe que no va a usar. Una de las razones para
hacer esto es que mientas no se haga, el lector del pipe no recibir EOF cuando
el otro lado cierre el pipe, ya que todava habr un extremo abierto (aunque no
utilizado ni tenido en cuenta).
Referencias

Ramrez, R. (2016). Sistemas Operativos. [en linea] Dtic.upf.edu. Disponible en:


http://www.dtic.upf.edu/~rramirez/os/ [Accesado 5 Abril 2016].

También podría gustarte