Está en la página 1de 4

FACULTAD DE INGENIERÍA DEL EJERCITO

INGENIERÍA INFORMÁTICA

Práctica de laboratorio Nro. 5: Comunicación entre procesos

“COMUNICACIÓN ENTRE PROCESOS – TUBERIAS SIN NOMBRE”

Analice e interprete el código que sigue:

1. Compile y corra el programa.


2. A partir de su salida explique con un gráfico el funcionamiento de la
tuberia.
3. ¿Existe comunicación entre procesos? ¿Por qué?
4. ¿Que características tienen la tuberías sin nombre y por que se emplean
entre procesos con relación de filiación?
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

int
main(int argc, char *argv[])
{
int pipefd[2];
pid_t cpid;
char buf;

if (argc != 2) {
fprintf(stderr, "Usage: %s <string>\n", argv[0]);
exit(EXIT_FAILURE);
}

if (pipe(pipefd) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}

cpid = fork();
if (cpid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}

if (cpid == 0) { /* Child reads from pipe */


close(pipefd[1]); /* Close unused write end */

while (read(pipefd[0], &buf, 1) > 0)


FACULTAD DE INGENIERÍA DEL EJERCITO
INGENIERÍA INFORMÁTICA

write(STDOUT_FILENO, &buf, 1);

write(STDOUT_FILENO, "\n", 1);


close(pipefd[0]);
_exit(EXIT_SUCCESS);

} else { /* Parent writes argv[1] to pipe */


close(pipefd[0]); /* Close unused read end */
write(pipefd[1], argv[1], strlen(argv[1]));
close(pipefd[1]); /* Reader will see EOF */
wait(NULL); /* Wait for child */
exit(EXIT_SUCCESS);
}
}

“COMUNICACIÓN ENTRE PROCESOS – TUBERIAS CON NOMBRE”

Compile y corra el programa.


Analice e interprete la llamada al sistema : “entrada = mkfifo ( "./fifo1", 0777 );”

1. ¿Qué diferencia fundamental encuentra respecto a las tuberías sin


nombre?
2. ¿Qué ocurre en el directorio de trabajo al correr el programa?
4. Verifique que ocurre en el servidor cuando abre varios procesos cliente a la
vez. ¿se pueden dar condiciones de competencia?
5. Desarrolle un programa óptimo que pase información de un proceso a otro
basado en un modelo de procesos cliente servidor empleando tuberías.

Pipe1.c

#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

int
main ( void )
{
int entrada;
int fd;
int c;
char buf_in[10];
char buf_out[10];

entrada = mkfifo ( "./fifo1", 0777 );


FACULTAD DE INGENIERÍA DEL EJERCITO
INGENIERÍA INFORMÁTICA

if ( (fd= open ("./fifo1", O_RDWR )) > 0 )


{
while ((c=getchar())!= EOF )
{
buf_in[0] = c;
write (fd, buf_in, 1 );
/* read (fd, buf_out , 1 );
putchar ( buf_out[0] );
*/

return 0;
}

Pipe2.c

#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

int
main ( void )
{
int entrada;
int fd;
int c;
char buf_in[10];
char buf_out[10];
/* La tuberia la crea el proceso cliente */

/* este proceso lee sobre la tuberia que creo el otro */


if ( (fd= open ("./fifo1", O_RDWR )) > 0 )
{
for (;;)
{
buf_in[0] = c;
FACULTAD DE INGENIERÍA DEL EJERCITO
INGENIERÍA INFORMÁTICA

read (fd, buf_out , 1 );


putchar ( buf_out[0] );

return 0;
}

También podría gustarte