PDF de programación - Capítulo 12. Comunicación entre procesos

Capítulo 12. Comunicación entre procesosgráfica de visualizaciones

Publicado el 17 de Julio del 2017
227 visualizaciones desde el 17 de Julio del 2017
90,1 KB
5 paginas
Creado hace 5a (30/07/2014)
Capítulo 12. Comunicación entre procesos

12.1. Objetivos

Entender los principios básicos de las comunicaciones entre procesos locales y remotos,
especialmente en Unix e Internet.

12.2. Documentación de las transparencias

Las transparencias relevantes para realizar esta práctica son:
- Páginas 49-55 de las transparencias de Unix
- Páginas 36-37 de las transparencias de C
- Páginas 40-46 de las transparencias de Bibliotecas de C y llamadas al sistema

12.3. Pipes con nombre (FIFOs)
Abra dos ventanas. En una de ellas cree una FIFO con
mkfifo pruebafifo
Haga de ella la entrada estándar de un programa; Por ejemplo,
sort < pruebafifo.
Observe que sort no hace nada. En la otra ventana escriba un texto de varias líneas desordenadas por
la FIFO. Por ejemplo, haga
cat > pruebafifo
Introduzca algunas líneas y termine con CONTROL-D. Explique lo que sucede.
Ahora haga justo lo contrario. Empiece por el cat. Escriba y termine con CONTROL-D. Haga el
sort. ¿Qué sucede? Explíquelo.

12.4. Búsqueda de objetos de comunicaciones

Busque los que hay en su sistema de ficheros, limitándose a los directorios /var, /home y /tmp,
para no perder tiempo, con:
find /var /home /tmp -type s 2>/dev/null
find /var /home /tmp -type p 2>/dev/null
Seguramente no encontrará ninguno de tipo FIFO en su sistema, bien porque no los haya o porque
estén en directorios de root protegidos. Sólo aparecerá el creado antes.
Para alguno de ellos, mire qué programa lo tiene abierto, si lo hay, con lsof objeto.
Mire qué conexiones hay establecidas con sockets (en dominio Unix y en dominio Internet) y por
qué proceso, usando netstat -p.
Mire qué servicios hay pendientes de conexión con sockets y por qué proceso servidor, usando
netstat -pa.

1

12.5. Uso de sockets en el dominio Internet

A continuación mostramos un cliente y un servidor iterativo del servicio daytime, que nos da la
fecha y la hora del servidor. El cliente ctiempo.c toma como primer parámetro la dirección IP del
servidor y como segundo parámetro el número de puerto:

Capítulo 12. Comunicación entre procesos

/* Cliente de daytime con direcciones IP */
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <locale.h>

#define LINELEN 128

static char *p;

static void uso(void) {

fprintf(stderr, "Uso:\n

%s direccion puerto\n", p); exit(1);

}

static void error(void) { perror(p); exit(errno); }

int main(int argc, char *argv[]) {

struct sockaddr_in sin;
int s, n, ne;
char buf[LINELEN];
char *direccion, *puerto;

p= argv[0];
if (argc != 3) uso();
setlocale(LC_ALL, ""); /* Mensajes de error en idioma local */
direccion = argv[1];
puerto = argv[2];
bzero(&sin, sizeof(sin)); /* Hay que poner todo a ceros */
sin.sin_family = AF_INET;
sin.sin_port = htons((u_short)atoi(puerto)); /* puerto en formato de red */
if (!inet_aton(direccion, &sin.sin_addr)) { /* dirección IP en formato de red */

/* IP del servidor */
/* Puerto del servidor */

fprintf(stderr, "direccion en formato incorrecto\n"); exit(1); }

s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); /* creo socket */
/* Llamo al servidor */
if (connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) error();
while ((n = read(s, buf, LINELEN)) > 0) /* Lee toda la respuesta */

/* y la copia a la salida estándar */

ne = write(1, buf, n);

if ((n < 0) || (ne < 0)) error();
exit(0);

}

El servidor stiempo.c toma como único parámetro el número de puerto del servicio.

/* Servidor de daytime */
#include <unistd.h>
#include <arpa/inet.h>

2

Capítulo 12. Comunicación entre procesos

#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <locale.h>
#include <time.h>

#define QLEN

5

static char *p;

static void uso(void) { fprintf(stderr, "Uso:\n

%s puerto\n", p); exit(1); }

static void error(void) { perror(p); exit(errno); }

int main(int argc, char *argv[]) {

struct sockaddr_in sin;
char
char
time_t
int

*pts;
*puerto;
ahora;

s, s2;

p = argv[0];
setlocale(LC_ALL, ""); /* Mensajes de error en idioma local */
if (argc != 2) uso();
puerto = argv[1];
bzero(&sin, sizeof(sin)); /* Hay que poner todo a ceros */
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons((u_short)atoi(puerto));
s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (bind(s, (struct sockaddr *)&sin, sizeof(sin))<0) error();
listen(s, QLEN);
while (1) {

if ((s2 = accept(s, NULL, NULL)) < 0) error();
time(&ahora);
pts = ctime(&ahora);
write(s2, pts, strlen(pts));
close(s2);

}

}

Compílelos y ejecútelos en su propia máquina y contra la de un compañero cercano (cliente de uno y
servidor del otro y servidor de uno y cliente del otro). Puede averiguar una dirección IP de su
máquina con la orden ifconfig. No puede usar puertos inferiores a 1024 (son privilegiados),

12.6. Uso de un servicio de nombres

El cliente visto necesita la dirección IP del servidor, pero la gente prefiere utilizar nombres, resueltos
en algún servicio de nombres, como el DNS. Use gethostbyname para resolver el servidor (mire el
manual para ver como se usa; fíjese que se le puede pasar un nombre o una dirección IP en formato
humano).

3

12.7. Interoperabilidad con Java (OPCIONAL)

Verifique la interoperabilidad con los programas Java del libro de teoría (fíjese que en este caso el
puerto y la dirección IP se determinan en tiempo de compilación); el cliente, DateClient.java:

Capítulo 12. Comunicación entre procesos

/* Client program requesting current date from server.
* Figure 3.27
* @author Gagne, Galvin, Silberschatz
* Operating System Concepts with Java - Eighth Edition
* Copyright John Wiley & Sons - 2010. */

import java.net.*;
import java.io.*;

public class DateClient {

public static void main(String[] args) throws IOException {

InputStream in = null;
BufferedReader bin = null;
Socket sock = null;
try {

sock = new Socket("127.0.0.1",6013);
in = sock.getInputStream();
bin = new BufferedReader(new InputStreamReader(in));
String line;
while( (line = bin.readLine()) != null)

System.out.println(line);

}
catch (IOException ioe) { System.err.println(ioe); }

finally { sock.close(); }

}

}

y el servidor DateServer.java:

/* Time-of-day server listening to port 6013.
* Figure 3.26
* @author Gagne, Galvin, Silberschatz
* Operating System Concepts with Java - Eighth Edition
* Copyright John Wiley & Sons - 2010. */

import java.net.*;
import java.io.*;

public class DateServer {

public static void main(String[] args) {

try {

ServerSocket sock = new ServerSocket(6013);
// now listen for connections
while (true) {

Socket client = sock.accept();
// we have a connection
PrintWriter pout = new PrintWriter(client.getOutputStream(), true);
// write the Date to the socket
pout.println(new java.util.Date().toString());
client.close();

}

}
catch (IOException ioe) { System.err.println(ioe); }

4

}

}

Capítulo 12. Comunicación entre procesos

12.8. Ficheros ofrecidos

En el directorio comunicacion:

• ctiempo.c.
• stiempo.c.
• El ejecutable del cliente de daytime pedido: ctiempon.
• DateClient.java.
• DateServer.java.

12.9. Resultados pedidos

• Fuentes del cliente de daytime con resolución de nombres: ctiempon.c.

5
  • Links de descarga
http://lwp-l.com/pdf5436

Comentarios de: Capítulo 12. Comunicación entre procesos (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios
Es necesario revisar y aceptar las políticas de privacidad