ARISO 2 Rubén Barrio Guerrero Escola Tècnica Superior dEnginyeria de Telecomunicació de Barcelona...
-
Upload
nuria-guiterrez -
Category
Documents
-
view
5 -
download
1
Transcript of ARISO 2 Rubén Barrio Guerrero Escola Tècnica Superior dEnginyeria de Telecomunicació de Barcelona...
![Page 1: ARISO 2 Rubén Barrio Guerrero Escola Tècnica Superior dEnginyeria de Telecomunicació de Barcelona (Universitat Politècnica de Catalunya)](https://reader033.fdocuments.co/reader033/viewer/2022061306/54b395ef4979594d3a8b5120/html5/thumbnails/1.jpg)
PipesARISO 2
Rubén Barrio GuerreroEscola Tècnica Superior d’Enginyeria de Telecomunicació de Barcelona
(Universitat Politècnica de Catalunya)
![Page 2: ARISO 2 Rubén Barrio Guerrero Escola Tècnica Superior dEnginyeria de Telecomunicació de Barcelona (Universitat Politècnica de Catalunya)](https://reader033.fdocuments.co/reader033/viewer/2022061306/54b395ef4979594d3a8b5120/html5/thumbnails/2.jpg)
Esta obra está bajo una licencia Reconocimiento-No comercial-Compartir bajo la misma licencia 2.5 España de Creative Commons. Para ver una copia de esta licencia, visite:
http://creativecommons.org/licenses/by-nc-sa/2.5/es/
o envíe una carta a:Creative Commons, 559 Nathan Abbott Way, Stanford,California 94305, USA.
Licencia Creative Commons
![Page 3: ARISO 2 Rubén Barrio Guerrero Escola Tècnica Superior dEnginyeria de Telecomunicació de Barcelona (Universitat Politècnica de Catalunya)](https://reader033.fdocuments.co/reader033/viewer/2022061306/54b395ef4979594d3a8b5120/html5/thumbnails/3.jpg)
Eres libre de: copiar, distribuir y comunicar públicamente la obra hacer obras derivadas
Bajo las condiciones siguientes: Atribución. Debes reconocer la autoría de la obra en los términos especificados por
el propio autor o licenciante. No comercial. No puedes utilizar esta obra para fines comerciales. Licenciamiento Recíproco. Si alteras, transformas o creas una obra a partir de esta
obra, solo podrás distribuir la obra resultante bajo una licencia igual a ésta. Al reutilizar o distribuir la obra, tienes que dejar bien claro los términos de la
licencia de esta obra. Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular
de los derechos de autor
Advertencia: Los derechos derivados de usos legítimos u otras limitaciones reconocidas por ley
no se ven afectados por lo anterior. Esto es un resumen legible por humanos del texto legal (la licencia completa)
Licencia Creative Commons
![Page 4: ARISO 2 Rubén Barrio Guerrero Escola Tècnica Superior dEnginyeria de Telecomunicació de Barcelona (Universitat Politècnica de Catalunya)](https://reader033.fdocuments.co/reader033/viewer/2022061306/54b395ef4979594d3a8b5120/html5/thumbnails/4.jpg)
PipesComunicación entre Procesos
![Page 5: ARISO 2 Rubén Barrio Guerrero Escola Tècnica Superior dEnginyeria de Telecomunicació de Barcelona (Universitat Politècnica de Catalunya)](https://reader033.fdocuments.co/reader033/viewer/2022061306/54b395ef4979594d3a8b5120/html5/thumbnails/5.jpg)
Los procesos no comparten memoria
Interesa que los procesos puedan pasarse información
El SO debe ofrecer mecanismos para:◦ Envío/Recepción de información◦ Sincronización
Comunicación entre procesos
CódigoP1
Datos P1
Pila P2
Memoria
CódigoP2
Datos P2
Pila P2
![Page 6: ARISO 2 Rubén Barrio Guerrero Escola Tècnica Superior dEnginyeria de Telecomunicació de Barcelona (Universitat Politècnica de Catalunya)](https://reader033.fdocuments.co/reader033/viewer/2022061306/54b395ef4979594d3a8b5120/html5/thumbnails/6.jpg)
Comunicación
◦ Envío/recepción de información Un proceso envía información a otro proceso Ambos procesos conocen el formato de la información SO: ficheros, pipes, named pipes, sockets
◦ Sincronización Un proceso avisa de la finalización de una tarea necesaria
para que otro proceso (o él mismo) puedan realizar otra tarea
No hay información relacionada, solamente es un aviso (evento)
SO: signals, pipes, sockets
Comunicación entre procesos
![Page 7: ARISO 2 Rubén Barrio Guerrero Escola Tècnica Superior dEnginyeria de Telecomunicació de Barcelona (Universitat Politècnica de Catalunya)](https://reader033.fdocuments.co/reader033/viewer/2022061306/54b395ef4979594d3a8b5120/html5/thumbnails/7.jpg)
PipesTeoría
![Page 8: ARISO 2 Rubén Barrio Guerrero Escola Tècnica Superior dEnginyeria de Telecomunicació de Barcelona (Universitat Politècnica de Catalunya)](https://reader033.fdocuments.co/reader033/viewer/2022061306/54b395ef4979594d3a8b5120/html5/thumbnails/8.jpg)
Una pipe es un buffer circular de bytes Sirve para comunicar 2+ procesos entre sí
Los datos que se leen de la pipe desaparecen
Dependiendo de la implementación pueden ser:◦ Unidireccionales: solo se puede leer o solo escribir◦ Bidireccionales: se puede leer y escribir
Pipe
desaparece crece
escrituralectura
PIPE
![Page 9: ARISO 2 Rubén Barrio Guerrero Escola Tècnica Superior dEnginyeria de Telecomunicació de Barcelona (Universitat Politècnica de Catalunya)](https://reader033.fdocuments.co/reader033/viewer/2022061306/54b395ef4979594d3a8b5120/html5/thumbnails/9.jpg)
Tipos de Pipes◦ Named Pipes◦ [Unnamed] Pipes
Procesos emparentados◦ Pipes◦ Named pipes
Procesos NO emparentados◦ Named pipes
Pipe
![Page 10: ARISO 2 Rubén Barrio Guerrero Escola Tècnica Superior dEnginyeria de Telecomunicació de Barcelona (Universitat Politècnica de Catalunya)](https://reader033.fdocuments.co/reader033/viewer/2022061306/54b395ef4979594d3a8b5120/html5/thumbnails/10.jpg)
Utilizadas por dos procesos cualquiera◦ Emparentados o no
Tienen una representación en el sistema de ficheros◦ Crear un fichero especial (named_pipe)
Solamente es necesario crear una vez este fichero◦ Se abre como un fichero normal (open)◦ Se trabaja con él como si fuese un fichero normal
(read, write, close)
Named Pipes
![Page 11: ARISO 2 Rubén Barrio Guerrero Escola Tècnica Superior dEnginyeria de Telecomunicació de Barcelona (Universitat Politècnica de Catalunya)](https://reader033.fdocuments.co/reader033/viewer/2022061306/54b395ef4979594d3a8b5120/html5/thumbnails/11.jpg)
int mknod (char *nompipe, int mode, dev_t device)
Crea un dispositivo (genérico), lo usaremos sólo para pipes◦ nompipe: nombre que tendrá el fichero tipo pipe◦ mode: indica que es una pipe y las protecciones del fichero◦ device: no es necesario ponerlo en el caso de una pipe◦ Devuelve 0 si OK y –1 si ERROR
Ejemplo: mknod(“mi_pipe”,S_IFIFO|0666,0)
Después ya se puede abrir como un fichero normal:
Ejemplo: open(“mi_pipe”, O_RDONLY)
Named Pipes
![Page 12: ARISO 2 Rubén Barrio Guerrero Escola Tècnica Superior dEnginyeria de Telecomunicació de Barcelona (Universitat Politècnica de Catalunya)](https://reader033.fdocuments.co/reader033/viewer/2022061306/54b395ef4979594d3a8b5120/html5/thumbnails/12.jpg)
Necesitan 1+ lector y 1+ escritor 2 opens en 2 procesos diferentes
◦ open (“nam_pip”, O_RDONLY)◦ open (“nam_pip”, O_WRONLY)
Named Pipes
struct files_stru
ct
struct files_stru
ct
struct dentry
d_count d_iname
2
struct inode
d_count d_iname
1Tabla de canales
Tabla de ficheros abiertos Tabla de i-nodos virtuales
struct file
f_count f_pos, f_mode,
1 RD
1 WR
I-nodo especial para
NAMED PIPES
![Page 13: ARISO 2 Rubén Barrio Guerrero Escola Tècnica Superior dEnginyeria de Telecomunicació de Barcelona (Universitat Politècnica de Catalunya)](https://reader033.fdocuments.co/reader033/viewer/2022061306/54b395ef4979594d3a8b5120/html5/thumbnails/13.jpg)
Utilizadas por dos procesos emparentados◦ Padre-hijo, padre-nieto, hermano-hermano
No tienen representación en el sistema de ficheros
Son buffers en memoria del SO Se crea y se abre a la vez
Pipes [Unnamed]
![Page 14: ARISO 2 Rubén Barrio Guerrero Escola Tècnica Superior dEnginyeria de Telecomunicació de Barcelona (Universitat Politècnica de Catalunya)](https://reader033.fdocuments.co/reader033/viewer/2022061306/54b395ef4979594d3a8b5120/html5/thumbnails/14.jpg)
int pipe (int fd[2]); Llamada a sistema que devuelve dos canales ya
abiertos◦ Abre dos canales de acceso a una pipe
fd[0] canal de sólo lectura fd[1], canal de sólo escritura Devuelve 0=OK, -1=Error
Lo que se escribe en fd[1] se lee por fd[0]
Pipes [Unnamed]
write(fd[1],...) read(fd[0],...)
![Page 15: ARISO 2 Rubén Barrio Guerrero Escola Tècnica Superior dEnginyeria de Telecomunicació de Barcelona (Universitat Politècnica de Catalunya)](https://reader033.fdocuments.co/reader033/viewer/2022061306/54b395ef4979594d3a8b5120/html5/thumbnails/15.jpg)
Necesitan 1+ lector y 1+ escritor◦ int fds[2];◦ pipe(fds);
Pipes [Unnamed]
struct files_stru
ct
Tabla de ficheros abiertos
struct file
f_count f_pos, f_mode,
1 RD
1 WR
Tabla de canales
Buffers de SO
![Page 16: ARISO 2 Rubén Barrio Guerrero Escola Tècnica Superior dEnginyeria de Telecomunicació de Barcelona (Universitat Politècnica de Catalunya)](https://reader033.fdocuments.co/reader033/viewer/2022061306/54b395ef4979594d3a8b5120/html5/thumbnails/16.jpg)
Open: bloquea hasta que exista la pareja◦ Solo se usa open con named pipes
Read (Si la pipe está vacía):◦ Si ningún proceso la tiene abierta para
escritura devuelve 0◦ Si existe ESCRITOR nos bloqueamos hasta:
Alguien escriba Se desbloquea y lee lo escrito
Los ESCRITORES desaparecen Devuelve 0
Llamadas a sistema E/S
![Page 17: ARISO 2 Rubén Barrio Guerrero Escola Tècnica Superior dEnginyeria de Telecomunicació de Barcelona (Universitat Politècnica de Catalunya)](https://reader033.fdocuments.co/reader033/viewer/2022061306/54b395ef4979594d3a8b5120/html5/thumbnails/17.jpg)
Write:◦ Si escribimos en una pipe que no tiene lectores
devuelve –1 y errno=EPIPE y el proceso recibe un evento (signal) SIGPIPE
◦ Si la pipe está llena el proceso se bloquea
Lseek◦ No se aplica a las pipes
Llamadas a sistema E/S
![Page 18: ARISO 2 Rubén Barrio Guerrero Escola Tècnica Superior dEnginyeria de Telecomunicació de Barcelona (Universitat Politècnica de Catalunya)](https://reader033.fdocuments.co/reader033/viewer/2022061306/54b395ef4979594d3a8b5120/html5/thumbnails/18.jpg)
PipesEjercicios solucionados
![Page 19: ARISO 2 Rubén Barrio Guerrero Escola Tècnica Superior dEnginyeria de Telecomunicació de Barcelona (Universitat Politècnica de Catalunya)](https://reader033.fdocuments.co/reader033/viewer/2022061306/54b395ef4979594d3a8b5120/html5/thumbnails/19.jpg)
Escribe un programa donde un proceso reciba 2 ficheros como parámetros. Este leerá el fichero de entrada (1er parámetro) y enviará todos los bytes leídos a un segundo proceso mediante una PIPE.
El segundo proceso escribirá un fichero (2º parámetro) solo con las vocales que reciba por la pipe, desechando las demás.
Ejercicio 1
![Page 20: ARISO 2 Rubén Barrio Guerrero Escola Tècnica Superior dEnginyeria de Telecomunicació de Barcelona (Universitat Politècnica de Catalunya)](https://reader033.fdocuments.co/reader033/viewer/2022061306/54b395ef4979594d3a8b5120/html5/thumbnails/20.jpg)
Ejercicio 1main(){ int pid,fd1,fd2,pipefd[2];char c;pipe(pipefd);pid = fork();if (pid > 0) {close(pipefd[0]);fd1 = open(argv[1], O_RDONLY);while(read(fd1, &c, 1)>0){ write(pipefd[1], &c, 1); }close(fd1);close(pipefd[1]);
}
![Page 21: ARISO 2 Rubén Barrio Guerrero Escola Tècnica Superior dEnginyeria de Telecomunicació de Barcelona (Universitat Politècnica de Catalunya)](https://reader033.fdocuments.co/reader033/viewer/2022061306/54b395ef4979594d3a8b5120/html5/thumbnails/21.jpg)
Ejercicio 1else {
close(pipefd[1]);fd2 = open(argv[2],O_WRONLY|O_CREAT|
O_TRUNC,0600);while (read(pipefd[0],&c,1) > 0) { if ((c=='a')||(c=='e') /* || .. */ )
{ write(fd2,&c,1); } }close(fd2);close(pipefd[0]);
}}
![Page 22: ARISO 2 Rubén Barrio Guerrero Escola Tècnica Superior dEnginyeria de Telecomunicació de Barcelona (Universitat Politècnica de Catalunya)](https://reader033.fdocuments.co/reader033/viewer/2022061306/54b395ef4979594d3a8b5120/html5/thumbnails/22.jpg)
Escribe un programa que cree tantos hijos como se le indique (1er parámetro). Cada hijo le enviará al padre su PID mediante una PIPE y luego morirá. El padre escribirá en un fichero (2º parámetro) de manera explicativa todos los identificadores que le lleguen por la PIPE.
Ejercicio 2
![Page 23: ARISO 2 Rubén Barrio Guerrero Escola Tècnica Superior dEnginyeria de Telecomunicació de Barcelona (Universitat Politècnica de Catalunya)](https://reader033.fdocuments.co/reader033/viewer/2022061306/54b395ef4979594d3a8b5120/html5/thumbnails/23.jpg)
Ejercicio 2main(int argc, char *argv[]) {
int fd[2], hijos, i, fd2, pid;char s[80];hijos=atoi(argv[1]);if (pipe(fd) < 0) { exit(0); }
for (i=0; i<hijos; i++) {
switch (fork()) {case -1: printf(“Error fork”); exit(0);case 0: pid=getpid();
write(fd[1], &pid, sizeof(pid));close(fd[0]);close(fd[1]);exit(0);
}}
![Page 24: ARISO 2 Rubén Barrio Guerrero Escola Tècnica Superior dEnginyeria de Telecomunicació de Barcelona (Universitat Politècnica de Catalunya)](https://reader033.fdocuments.co/reader033/viewer/2022061306/54b395ef4979594d3a8b5120/html5/thumbnails/24.jpg)
Ejercicio 2close(fd[1]);
fd2=open(argv[2], O_WRONLY|O_CREAT|O_TRUNC,0600);for (i=0; i<hijos; i++)
{read(fd[0], &pid, sizeof(pid));sprintf(s, "Pid leido = %d\n", pid);write(fd2, s, strlen(s));}
close(fd[0]); close(fd2);}
![Page 25: ARISO 2 Rubén Barrio Guerrero Escola Tècnica Superior dEnginyeria de Telecomunicació de Barcelona (Universitat Politècnica de Catalunya)](https://reader033.fdocuments.co/reader033/viewer/2022061306/54b395ef4979594d3a8b5120/html5/thumbnails/25.jpg)
Escribe un programa que emule el comportamiento del shell de manera que pueda enlazar con una PIPE dos comandos.
> comando1 | comando2
> ./ejer1 comando1 comando2
Ejercicio 3
![Page 26: ARISO 2 Rubén Barrio Guerrero Escola Tècnica Superior dEnginyeria de Telecomunicació de Barcelona (Universitat Politècnica de Catalunya)](https://reader033.fdocuments.co/reader033/viewer/2022061306/54b395ef4979594d3a8b5120/html5/thumbnails/26.jpg)
Ejercicio 3int main(int argc,char **argv){ int fd[2]; pipe(fd); if (fork() == 0) { close(0); dup(fd[0]); close(fd[0]); close(fd[1]); execlp(argv[2], argv[2], NULL); exit(0); } if (fork() == 0) { close(1); dup(fd[1]); close(fd[0]); close(fd[1]); execlp(argv[1], argv[1], NULL); exit(0); }
close(fd[0]); close(fd[1]); wait(NULL); wait(NULL);}
![Page 27: ARISO 2 Rubén Barrio Guerrero Escola Tècnica Superior dEnginyeria de Telecomunicació de Barcelona (Universitat Politècnica de Catalunya)](https://reader033.fdocuments.co/reader033/viewer/2022061306/54b395ef4979594d3a8b5120/html5/thumbnails/27.jpg)
Escribe un programa donde un proceso reciba 2 ficheros como parámetros. Este leerá el fichero de entrada (1er parámetro) y enviará todos los bytes leídos a un segundo proceso mediante una NAMED_PIPE.
El segundo proceso escribirá un fichero (2º parámetro) solo con las vocales que reciba por la pipe, desechando las demás.
Ejercicio 1 v. Named
![Page 28: ARISO 2 Rubén Barrio Guerrero Escola Tècnica Superior dEnginyeria de Telecomunicació de Barcelona (Universitat Politècnica de Catalunya)](https://reader033.fdocuments.co/reader033/viewer/2022061306/54b395ef4979594d3a8b5120/html5/thumbnails/28.jpg)
Ejercicio 1 v. Namedmain(){ int pid,fd1,fd2,fdpipe;char c;mknod("ej1.pipe",S_IFIFO|0666,0);pid = fork();if (pid > 0) {
fd1 = open(argv[1], O_RDONLY);fdpipe = open("ej1.pipe", O_WRONLY);while(read(fd1, &c, 1)>0)
{ write(fdpipe, &c, 1); }close(fd1);close(fdpipe);
}
![Page 29: ARISO 2 Rubén Barrio Guerrero Escola Tècnica Superior dEnginyeria de Telecomunicació de Barcelona (Universitat Politècnica de Catalunya)](https://reader033.fdocuments.co/reader033/viewer/2022061306/54b395ef4979594d3a8b5120/html5/thumbnails/29.jpg)
Ejercicio 1 v. Namedelse {
fd2 = open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0600);
fdpipe = open("ej1.pipe", O_RDONLY);while (read(fdpipe,&c,1) > 0) { if ((c=='a')||(c=='e') /* || .. */ )
{ write(fd2,&c,1); } }close(fd2);close(fdpipe);
}}
![Page 30: ARISO 2 Rubén Barrio Guerrero Escola Tècnica Superior dEnginyeria de Telecomunicació de Barcelona (Universitat Politècnica de Catalunya)](https://reader033.fdocuments.co/reader033/viewer/2022061306/54b395ef4979594d3a8b5120/html5/thumbnails/30.jpg)
Como pasarías información de un proceso a otro lanzados en shells diferentes? Queriendo simular la siguiente operación.
> ls –lisa | sort
Ejercicio 4
![Page 31: ARISO 2 Rubén Barrio Guerrero Escola Tècnica Superior dEnginyeria de Telecomunicació de Barcelona (Universitat Politècnica de Catalunya)](https://reader033.fdocuments.co/reader033/viewer/2022061306/54b395ef4979594d3a8b5120/html5/thumbnails/31.jpg)
Escribe un programa donde un padre (viejo) genere tantos hijos (palomas) como reciba en su primer parámetro.
El viejo tirará 100 granos de maíz para alimentar a las palomas. Las palomas deben competir por el alimento, de manera que cada grano de maíz solo puede ser “comido” por una paloma.
Al final, el abuelo espera a que las palomas se coman todo el maíz antes de irse.
Cada paloma se quedará comiendo hasta que no haya más maíz, una vez finalizada la papelina, anunciará cuantos granos ha comido y emprenderá el vuelo.
Ejercicio 5
![Page 32: ARISO 2 Rubén Barrio Guerrero Escola Tècnica Superior dEnginyeria de Telecomunicació de Barcelona (Universitat Politècnica de Catalunya)](https://reader033.fdocuments.co/reader033/viewer/2022061306/54b395ef4979594d3a8b5120/html5/thumbnails/32.jpg)
Ejercicio 5int main (int arvc, char *argv[]){ int num,pipefd[2],i,val,total=0,pid;
char c;num=atoi(argv[1]);pipe(pipefd);
for(i=0;i<num;i++) {pid = fork();if (pid==0) { close(pipefd[1]); do {num=read(pipefd[0],&val,sizeof(int));if(num>0) total=total+val; } while(num>0); close(pipefd[0]); printf("Hijo %d (%d): %d\n",i,getpid(),total);
exit(0); }}
![Page 33: ARISO 2 Rubén Barrio Guerrero Escola Tècnica Superior dEnginyeria de Telecomunicació de Barcelona (Universitat Politècnica de Catalunya)](https://reader033.fdocuments.co/reader033/viewer/2022061306/54b395ef4979594d3a8b5120/html5/thumbnails/33.jpg)
Ejercicio 5 close(pipefd[0]); val=1; for(i=0;i<100;i++) { write(pipefd[1],&val,sizeof(int)); } close(pipefd[1]); for(i=0;i<num;i++) wait(NULL);
}
![Page 34: ARISO 2 Rubén Barrio Guerrero Escola Tècnica Superior dEnginyeria de Telecomunicació de Barcelona (Universitat Politècnica de Catalunya)](https://reader033.fdocuments.co/reader033/viewer/2022061306/54b395ef4979594d3a8b5120/html5/thumbnails/34.jpg)
Que habría que cambiar para que las palomas no dijesen nada (printfs), y fuese el viejo el que escribiese cuantos granos ha comido cada paloma?
Ejercicio 5