Programación Procedural M.C. Juan Carlos Olivares Rojas [email protected] jcolivar Agosto,...

142
Programación Procedural M.C. Juan Carlos Olivares Rojas [email protected] http://antares.itmorelia.edu.mx/~jc olivar Agosto, 2009

Transcript of Programación Procedural M.C. Juan Carlos Olivares Rojas [email protected] jcolivar Agosto,...

Page 1: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación Procedural

M.C. Juan Carlos Olivares Rojas

[email protected]://antares.itmorelia.edu.mx/~jcolivar

Agosto, 2009

Page 2: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Agenda

2.1 Características principales de los lenguajes procedurales

 2.2 Lenguajes representativos: C y AJAX.

Page 3: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Introducción• Este tipo de programación se basa en la Este tipo de programación se basa en la

modularidad de los programasmodularidad de los programas. Esto . Esto quiere decir que los programas se dividen quiere decir que los programas se dividen en módulos más pequeños, y cada uno en módulos más pequeños, y cada uno realiza una tarea específica. Así, la realiza una tarea específica. Así, la complejidad de un problema determinado complejidad de un problema determinado también se ve reducida al dividir las también se ve reducida al dividir las tareas, que, en su conjunto, permiten la tareas, que, en su conjunto, permiten la resolución de éste.resolución de éste.

Page 4: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Introducción• En el pasado la programación no estaba

estructurada por lo que se tenía el código GO TO que hacía al código verse como espagueti.

• La programación modular permite reutilizar código y hacer los programas más fáciles de elaborar.

Page 5: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Pasos para resolver un problema:

1. Definición del problema2. Diseño del algoritmo para resolverlo3. Transformación del algoritmo en un

programa4. Ejecución y validación del programa

ProblemaProblema Diseño del Diseño del algoritmoalgoritmo

Programa Programa de de

computadoracomputadora

Ejecución Ejecución y y

validaciónvalidación

Page 6: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

¿Que es un algoritmo?

• Un algoritmo es la secuencia ordenada de pasos que conducen a la solución de un problema dado, y puede ser expresado en lenguaje natural, por ejemplo el castellano

Page 7: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Características de un algoritmo

• Preciso. Indicar el orden de realización de cada paso

• Definido. Si se sigue un algoritmo dos veces, se debe obtener el mismo resultado cada vez.

• Finito. Debe terminar el algún momento

Page 8: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Algoritmo para hacer una taza de té

InicioTomar la teteraLlenarla de aguaEncender el fuegoMientras no hierva el agua

Esperar

Introducir una bolsa de té en la teteraVaciar el té en la taza

fin

Page 9: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Ejemplo• Construya un algoritmo para preparar “Pechugas de pollo

en salsa de elote y chile poblano”:

– Ingredientes (para 6 personas)– 3 Pechugas deshuesadas, sin piel y partidas a la mitad.– 1 diente de ajo– 4 gramos de pimienta negra. Sal.– 6 cucharadas de aceite– 5 chiles poblanos asados y limpios.– ½ Taza de leche.– ¼ Taza de crema ligera.– 1 lata de crema de elote.

Page 10: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Ejemplo• Algoritmo (Preparación):

– Muela el ajo, la pimienta y un poco de sal y únteselo a las pechugas.

– Caliente el aceite y dore las pechugas.– Licue los chiles con la leche y la crema, y

mézclelos con la crema de elote.– En una fuente coloque las pechugas y báñelas

con la mezcla anterior.– Cubra el platón con papel aluminio y hornee a

200 °C, durante 15 minutos.

Page 11: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Otros ejemplos de algoritmos• Las instrucciones o serie de pasos que sigues para

grabar un número telefónico en tu celular.

• Las instrucciones que te dan para resolver un examen.

• Los pasos que sigues para prender el carbón para una carne asada

• El procedimiento que sigues para inscribirte

• EL procedimiento para obtener tu pasaporte

• La receta que sigues para preparar un pastel

• Los pasos para invitar a alguien al cine

Page 12: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Introducción

• Existen varias formas de representar soluciones a problemas, como son algoritmos, lenguaje estructurado, seudocódigo, diagramas de flujo, etc.

• Estas herramientas no son lenguajes de programación y por lo tanto una computadora no tiene capacidad para procesarlos, su propósito es proporcionar una manera de documentar sus ideas para el diseño de programas.

Page 13: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Introducción

• Es un sistema de notación para algoritmos que se han descrito como una mezcla de lenguaje común y su lenguaje de programación favorito.

• El pseudocódigo está menos formalizado que el lenguaje estructurado de modo que la estructura y la redacción dependen del usuario.

Page 14: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Introducción

• Cuando se escribe pseudocódigo, se permite incorporar palabras de comandos y sintaxis del lenguaje computacional que se pretende usar para el programa actual.

• Otras formas de representación son los diagramas de flujo, los cuales muestran de manera gráfica como resolver problemas.

Page 15: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Símbolos del diagrama de Flujo

Page 16: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Símbolos del diagrama de Flujo

Page 17: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Símbolos del diagrama de Flujo

Page 18: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Símbolos del diagrama de Flujo

Page 19: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Símbolos del diagrama de Flujo

Page 20: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Símbolos del diagrama de Flujo

Page 21: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Diagramas Nassi-Scneiderman

• Conocidos como Diagramas N-S o Diagramas de Chapin. Las acciones se escriben dentro de cajas sucesivas.

Page 22: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Ejercicio• Realizar el siguiente algoritmo

REGISTRO DE VENDEDORES.• Una tienda emplea un cierto número de vendedores. La

mayoría de estos empleados obtienen sus ingresos de comisiones sobre los artículos que venden, pero existen algunos empleados que obtienen su salario fijo, sin importar el tipo o cantidad de artículos que venden, más una comisión por sobre ciertos artículos.

• La tienda ofrece distintos tipos de mercancías, algunas de las cuales se clasifican como artículos estándar por que son de uso común y no requieren de técnicas creativas de venta; además, hay artículos que son altamente remunerados pero difíciles de vender.

Page 23: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Ejercicio• Los compradores también se clasifican.

Algunos se conocen como compradores regulares, pues hacen transacciones tan a menudo que no se requiere de hacerles venta creativa. Sin embargo, la mayoría de los clientes hacen pocas transacciones dentro de la tienda, y es probable que entren, compren algo y no vuelvan a ser vistos.

Page 24: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Ejercicio

• Si un empleado vende cualquier tipo de artículo a un cliente regular, no se da comisión alguna.

• Si un empleado asalariado vende un artículo extra, recibe una comisión del 10% a menos que el artículo tenga un precio mayor de $10,000, en cuyo caso recibe una comisión del 15%.

Page 25: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Ejercicio• Si un empleado no asalariado vende un

artículo extra a alguien que no sea un comprador regular, recibe un 15% de comisión a menos que el artículo tenga un precio mayor a $10,000 en cuyo caso recibe una comisión del 20%. Si un empleado asalariado vende un artículo estándar recibe un 3% de comisión, en caso de ser un empleado no asalariado recibe un 7%.

Page 26: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Ejercicio• Realizar este problema en lenguaje C o

en algún otro lenguaje procedimental.

• La E de datos se da desde línea de comandos, la salida se mostrará en pantalla.

• El entorno deberá de ser de preferencia un sistema *X.

Page 27: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación en C en UNIX

• Por default el sistema operativo Unix y variantes está hecho en C.

• Los programas se compilan con la opción gcc archivo.c –o nombre.

• Se deberá asegurar que se tengan permisos de ejecución. Sino aplicar chmod +a nombre

Page 28: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación en C en UNIX

• Aplica exactamente el mismo lenguaje ANSI C por lo que la portabilidad está garantizada a otras plataformas.

• Los tipos de datos varían de acuerdo a la arquitectura de computadoras utilizada. Se puede conocer a través del comando sizeof().

• Se utiliza mucho la línea de argumentos para pasar valores.

Page 29: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Pse

ud

ocó

dig

o

Page 30: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

30

Diagrama de Flujo“Cálculo de comisión”

Page 31: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Ejercicio resuelto

Page 32: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Características• Los primeros programas modulares y que

contribuyeron al desarrollo del paradigma procedimental fueron los macroensambladores que permitieron reutilizar código fuente

• A continuación se muestran las principales características que presentan los lenguajes con paradigma procedimental. Se dará un repaso de cómo se implementan estas en Lenguaje C.

Page 33: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

SENTENCIAS DE CONTROL

Page 34: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Estructura Selectiva

Diagrama de Flujo

Diagrama N-S

Pseudocódigo

si <condición> entonces acción 1fin_si

Page 35: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Estructura Selectiva Doble

Diagrama de Flujo

Diagrama N-S

Pseudocódigo

si <condición> entonces acción 1si_no acción 2fin_si

Page 36: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Estructura Selectiva Múltiple

Diagrama de Flujo

Diagrama N-S

Page 37: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Estructura Selectiva Múltiple

Estructura Selectiva Múltiple

Pseudocódigo

según_sea <expresión> hacer <lista 1> : acción 1 <lista 2> : acción 2 . . . [si_no acción n]fin_según

Page 38: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Estructura Repetitiva

Diagrama de Flujo Diagrama N-S

Pseudocódigo mientras <expresión lógica> hacer acción fin_mientras

Page 39: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Estructura Repetitiva

Diagrama de Flujo Diagrama N-S

Pseudocódigo repetir acción hasta_que <expresión lógica>

Page 40: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Estructura Anidada

• Tanto las estructuras selectivas como las repetitivas pueden ser anidadas, e introducidas unas en el interior de las otras.

Pseudocódigo

si <condición1> entonces <acciónes1>si_no si <condición2> entonces <acciones2> si_no si <condición3> entonces <acciones3> si_no <accionesX> fin_si fin_sifin_si

Page 41: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

C• Actividad: Desarrollar un programa para

calcular el área de un triángulo conociendo solamente la longitud de sus tres lados.

• ¿Qué se necesita? Entender el problema. La fórmula es:

• S = (A + B + C)/2

Page 42: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

C

• Donde A, B y C son los lados del triangulo. Después se aplica la fórmula:

• Se debe utilizar la función sqrt dentro de la biblioteca math.h

))()(( CSBSASSÁrea

Page 43: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

C• Realizar un programa que permita

jugar “Craps”. Dicho juego consiste en lanzar dos dados (simulación realizada a través de una función que se invoque dos veces) y sumar la puntuación. Si la suma de los dados da 2,3 o 12 el usuario pierde inmediatamente.

• El programa deberá manejar funciones

Page 44: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

C• Si la suma da 7 u 11 el usuario gana. Si da

cualquier otra combinación 4,5,6,8,9 o 10, el usuario tiene otra segunda oportunidad.

• El programa debe de pedir al usuario la cantidad de dinero con la que cuenta el usuario. Por cada juego se debe pedir la apuesta. Se debe sumar o restar dependiendo de si ganó o perdió el juego. El juego termina hasta tener 0 pesos o bien que el usuario decida salir.

Page 45: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

C• Actividad: realizar un programa que permita

simular una partida de póker. El usuario deberá tener 5 cartas. La simulación consiste en repartir aleatoriamente cartas. Del 1 al 10 las cartas de corazones (donde el 1 representa el as), del 11 al 20 los diamantes (por ejemplo el 13) indica que se sacó el tres de diamantes, del 21 al 30 el trebol, y del 31 al 40 las picas. Los jotos están representados del 41 al 44, donde el 41 representa el joto de corazones y así sucesivamente.

Page 46: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

C

• Las reinas están representadas del 51 al 54 (por ejemplo el 52 representa la reina de diamantes), y los reyes están del 61 al 64 (donde el 64 es el rey de picas).

• No se deberán repartir cartas. Se debe indicar si se hizo alguna jugada válida del póker (par, dos pares, tercia, full (tercia, par), póker (4 figuras igual), flor y flor imperial).

Page 47: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

C

• Actividad: realizar un programa que permita calcular la exponencial de un número dado.

!...

!2!11

2

nxxx

en

x

Page 48: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

C

• Actividad: Resolver un sistema de ecuaciones de tamaño n con n incógnitas por la Regla de Cramer y el Método Gauss-Jordan.

• Determinantes.

Page 49: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

C• Actividad: Realizar otro programa que

permita determinar la multiplicación y la división de un número entero por dos. Se debe de hacer con operadores de bits.

• Actividad: realizar un programa que permita determinar si un número tiene paridad par o impar, considerar todos los bits menos el más significativo, el cual deberá contener un 0 si es paridad par o un 1 si es paridad impar.

Page 50: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación Distribuida• La programación distribuida o

programación en red implica todo un cambio de paradigmas en la forma de pensar los programas.

• La arquitectura más conocida es la cliente/servidor por lo que la lógica de la aplicación se ve dividida en dos grandes bloques: la lógica de la aplicación o modelo y los datos en el lado del servidor y la presentación en el lado del cliente.

Page 51: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación Distribuida• La comunicación entre las distintas

entidades se hace a través de paso de mensajes.

• El modelo más implementado de pasos de mensajes es el mecanismo de sockets.

• Se les denomina conectores por que unen procesos cliente y servidor, de manera semejante a como se unir un enchufe de un dispositivo eléctrico con un zócalo.

Page 52: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación Distribuida• El mecanismo de sockets más conocido

es el referente a la API de Berkeley.

• Está API está implementado en prácticamente todos los sistemas Unix, por lo que se maneja C, pero también está portado a otras arquitecturas como Windows (WinSock) y a otros lenguajes como Java.

Page 53: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación Distribuida• Para la comunicación de procesos

remotos se necesita conocer la dirección de la máquina destino y el puerto donde se va a escuchar.

• Los sockets no están casados con ningún tipo de red, por lo que se pueden implementar en diversos protocolos de red como IPX/SPX, NetBEUI, TCP/IP, siendo este último el más importante.

Page 54: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación Distribuida• Las primitivas de sockets vienen defindas

en <sys/socket.h>

• Para utilizar sockets TCP/IP se debe emplear la familia o protocolo Internet, la cual define sus direcciones en <netinet/in.h> y son:

Page 55: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación Distribuidastruct sockaddr_in {

short sin_familiy; /*AF_INET*/u_short sin_port; /*16 bits*/struct in_addr sin_addr; /*32 bits*/char sin_zero[8]; /*8 bytes no usados*/

};

• Existen dos tipos de sockets: orientados a la conexión (stream/TCP) y no orientados a la conexión (datagram/UDP).

Page 56: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación Distribuida• Las primitivas para comunicación

orientada a conexión (Stream) en el lado del servidor son:

socket();bind();listen();accept();read();write();

Page 57: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación Distribuida• Las primitivas de sockets pueden ser

bloqueantes y no bloqueantes. Las primitivas stream en el lado cliente son:

socket();connect();write();read();close();

Page 58: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación Distribuida

Page 59: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación Distribuida• Las primitivas para comunicación entre

procesos no orientada a conexión (Datagramas) en el lado del servidor son:

socket();bind();recvfrom();sendto();

Page 60: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación Distribuida• Las primitivas de comunicación con

datagramas en elclinente son:

socket();bind();*sendto(); recvfrom();shutdown();

*Opcional sólo si se requiere de respuesta del lado del cliente.

Page 61: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación Distribuida• A continuación se muestran la

implementación de las funciones de comunicación en red:

Socket(int af, int type, int protocol)• Tipos: SOCK_STREAM, SOCK_DGRAM

bind(int sfd, const void *addr, int addrlen);

listen(int sfd, int backlog);

Page 62: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación Distribuidaconnect(int sfd, void *addr, int addrlen);

Ns =accept(int sfd, void *addr, int *addrlen);

Todas las funciones regresan -1 para error

• Para leer datos de un socket se pueden utilizar las siguientes primitivas: read, readv, recv(sfd, buf, len, flags), recvfrom y recvmsg.

Page 63: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación Distribuida• Para escribir datos en un socket se

utilizan las siguientes primitivas: write, writev, send, sendto y sendmsg, siendo las más utilizadas write y send(sfd, buf, len, flags).

• Se necesitan funciones de conversión para poder homogenizar las diferencias existentes entre las diversas arquitecturas de cómputo.

Page 64: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación Distribuida• En <arpa/inet.h> se encuentra definida la

función inet_addr(char *) convierte una dirección IP en formato de cadena a su representación en bytes.

• char *inet_ntoa(struct in_addr) convierte una dirección IP a cadena.

unsigned long htonl(unsigned long hostlong);unsigned short htons(unsigned short hshort);unsigned long ntohl(unsigned long netlong);

Page 65: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación Distribuidaunsgined long ntohs(unsigned short netsho);• h:host n:network l:long s:short

/*Ejemplo de Servidor*/int sfd, nsfd, pid;struct sockaddr_in ser, cli;int tam_clie;

if((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1) /*Error al crear el socket*/

Page 66: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación Distribuida/*Dirección del servidor*/ser.sin_family = AF_INET;ser.sin_addr.s_addr =

inet_addr( “148.208.209.25”);ser.sin_port = htons(24400);

if(bind(sfd, &ser, sizeof(ser)) == -1)/*Error al publicar dirección*/

listen(sfd, 5);

Page 67: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación Distribuidafor(;;){ /*Un servidor siempre está activo*/

tam_clie = sizeof(clie);if((nsfd = accept(sfd, &clie, &tam_clie)) == -

1) /*Error al aceptar peticiones*/

if((pid = fork()) ==-1) /*Error al crear subproceso*/

else if(pid ==0) /*Hijo atiende peticiones*//*Código padre*/ close(sfd);

}

Page 68: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación Distribuida• /*Ejemplo de cliente stream*/ser.sin_addr.s_addr =

inet_addr( “148.208.209.25”);ser.sin_port = htons(24400);

if(connect(sfd, &ser, sizeof(ser)) ==-1) /*Error al conectar*/

send(); read(); ….close(sfd);

Page 69: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación Distribuida• /*Servidor de Datagramas*/int sfd;struct sockaddr_in ser, clie;

if((sfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) /*Error al crear socket datagrama*/

/*Dirección del servidor*/ser.sin_family = AF_INET;ser.sin_port = htons(21100);

Page 70: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación Distribuidaser.sin_addr.s_addr =

inet_addr( “142.208.209.25”);

if(bind(sfd, &ser, sizeof(ser)) ==-1) /*Error al ligar el socket*/

recvfrom(); sendto();close(sfd);

Page 71: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación Distribuida• /*Cliente datagrama*/int sfd;struct sockaddr_in ser, clie;

if((sfd = socket(AF_INET, SOCK_DGRAM, 0)) ==-1) /*Error al crear el socket*/

/*Dirección del servidor*/ser.sin_family = AF_INET;ser.sin_port = htons(21100);

Page 72: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación Distribuidaser.sin_addr.s_addr =

inet_addr( “148.208.209.25”);

/*Dirección del cliente*/cli.sin_family = AF_INETcli.sin_addr.s_addr =

inet_addr(INADDR_ANY);cli.sin_port = htons(0);

if(bind(sfd, &cli, & sizeof(cli)) ==-1) /*Error*/

Page 73: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación Distribuidasento(); recvfrom(); …close(sfd);

• Se puede utilizar resolución de nombres si se utiliza la biblioteca <netdb.h> de la siguiente forma:

struct hostent *host;

if((host = gethostbyname(argv[1])) ==-1) /*Error al resolver nombre a IP*/

Page 74: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación Distribuida• ser.sin_addr.s_addr = *(long *) host->

h_addr_list;

• Se pueden utilizar mecanismos más simplificados llamados middlewares que nos permiten enmascarar la complejidad de la comunicación en red. Los principales middlewares son: RPC, RMI, CORBA y los servicios Web

Page 75: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación de CGIs• El CGI (Common Gateway Interface) es

una interfaz común que permite el pasar parámetros y realizar programación en el lado del servidor.

• Generalmente se programa en Perl y en C aunque pueden ser en otros lenguajes. La mayoría de los servidores Web definen una carpeta especial para poderse ejecutar. Se deben de revisar los permisos de la carpeta y configuración del servidor.

Page 76: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación de CGIs• En el caso del servidor Web apache, los

CGIs se invocan desde la URL: http://mi.sitio.com/cgi-bin/miarchivo.cgi

• Las extensiones deben de ser .cgi o .exe para el caso de Windows. Estos archivos se guardan dentro de la carpeta CGI-EXEC (Mac OS X).

Page 77: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación de CGIs• Se debe tener activado el módulo

cgi_module y la directiva ExecCGI sobre el DocumentRoot dentro del archivo de configuración httpd.conf

• La programación de CGIs se hace como cualquier programa en C, de manera automática la entrada y la salida estándar están redireccionadas al servidor Web.

Page 78: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación de CGIs• /*Ejemplo de CGI*/• #include <stdio.h>

• int main(){ • printf("Content-Type: text/html\n\n");

printf("<html>"); printf("<head><title>Ejemplo de CGI</title></head>");

• printf("<body><p>Hola Mundo</p>"); printf("<br /><h1>Ejemplo de programaci√n</h1></body>");

Page 79: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación de CGIs• printf("</html>"); • return 0;• }

• Nótese que se debe de indicar el encabezado de HTTP Content-Type para indicarle al navegador Web que la salida generada por el servidor la interprete como HTML.

Page 80: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación de CGI• /*Ejemplo de paso de

parámetros*/#include <stdio.h>• #include <stdlib.h>• int main(){ • printf("Content-Type: text/html\n\n");

printf("Documento antecesor: %s\n", getenv("HTTP_REFERER")); printf("Navegador: %s\n", getenv("HTTP_USER_AGENT")); printf("Sistema Operativo: %s", getenv("HTTP_USER_OS"));

Page 81: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación de CGIs• printf("Host remote: %s",

getenv("REMOTE_HOST")); printf("Dirección Remota: %s", getenv("REMOTE_ADDR"));

• return 0;• }

• Las variables de entorno se obtienen con la función getenv().

Page 82: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación de CGIs• /*Ejemplo de paso de

parámetros*/#include <stdio.h>• #include <stdlib.h>• #include <string.h>• int main(){ • char variable[100]; • printf("Content-Type: text/html\n\n"); • strcpy(variable,

getenv("QUERY_STRING")); printf("Variables recibidas por el método GET= %s", variable);

Page 83: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación de CGIs• return 0;• }

• La variable de entorno QUERY_STRING tiene todas las variables pasadas por u formulario por el método get. En dicho método las variables forman parte de la URL: http://sitio.com/cgi-bin/variables.cgi?var1=valor&var2=xy

Page 84: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación de CGIs• Realizar una descomposición de la

cadena anterior para tener en variables distintas el valor de cada una de ellas.

• EXTRA: realizar un programa que permite convertir cualquier recurso en una URL válida. Por ejemplo en las URL no hay espacios en blanco, ni acentos ni signos de puntuación especiales.

Page 85: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación de CGIs• #include <stdio.h>• #include <stdlib.h>• #define MAX 80• int main(void){• char *longcad;• char entrada[MAX+1];• long longitud;• printf("Content-Type:text/

html;charset=iso-8859-1\n\n");• printf("<TITLE>Respuesta</TITLE>\n");

Page 86: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación de CGIs• longcad = getenv("CONTENT_LENGTH");• if(longcad == NULL ||

sscanf(longcad,"%ld",&longitud)!=1 || len > MAXLEN)

• printf("<P>Error en invocacion probablemente del formulario.");

• else { • fgets(entrada, longitud+1, stdin); • printf("<P>Los datos por post son: <BR>

%s", entrada); • } return 0;}

Page 87: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación de CGIs• Las variables por el método POST se

pasan dentro del encabezado HTTP de la petición.

• Al igual que con el método get, se necesita separar el contenido de cada variable.

Page 88: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación de CGIs• REALIZAR un programa que

descomponga las variables enviadas por POST, las almacene en un archivo y verifique si ya estaban dados de alta anteriormente.

• Para no quedarnos con la duda se verá un ejemplo de un CGI en Perl (lenguaje interpretado)

Page 89: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación de CGIs• #!/bin/sh• # disable filename globbing• set -f• echo "Content-type: text/plain;

charset=iso-8859-1"• echo• echo CGI/1.0 test script report:• echo• echo argc is $#. argv is "$*".• echo

Page 90: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación de CGIs• echo SERVER_SOFTWARE =

$SERVER_SOFTWARE• echo SERVER_NAME = $SERVER_NAME• echo GATEWAY_INTERFACE =

$GATEWAY_INTERFACE• echo SERVER_PROTOCOL =

$SERVER_PROTOCOL• echo SERVER_PORT = $SERVER_PORT• echo REQUEST_METHOD =

$REQUEST_METHOD

Page 91: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

GTK• GTK es una librería para el desarrollo de

aplicaciones con entornos gráficos disponible para varios sistemas *X.

• GTK es el motor principal del proyecto gnome, el principal escritorio en los sistemas *X libres.

• Se pueden utilizar herramientas como Glade que permitan la construcción rápida de entornos gráficos.

Page 92: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

GTK• La implementación de los eventos se

realiza aparte.

• Se deben de indicar las librerías al momento de compilar.

• gcc -Wall -g helloworld.c -o hello_world `gtk-config --cflags` \ `gtk-config --libs`

Page 93: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

GTK• Se ha portado a diversos lenguajes de

programación no sólo C, sino también hay versiones disponibles para .NET, PHP, Python entre otros.

• Las nuevas versiones de Glade requieren de la herramienta gtk-builder para poderse compilar de forma adecuada, ya que el archivo resultante de la interfaz se guarda en formato XML.

Page 94: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

NCurses• Para poder mostrar aplicaciones en modo

texto de forma mejorada se utiliza la biblioteca ncurses definida en los sistemas *X.

/*Bosquejo de curses*/#include <curses.h>int main(void){ initscr(); endwin(); return 0;}

Page 95: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

NCurses• En general se hace referencia a curses.h

por que ncurses no está definida en todos los sistemas *X.

• Para compilar es necesario incluir la biblioteca curses: gcc archivos.c –o salida –lcurses

• /*Programa que muestra las dimensiones de una ventana de texto */

Page 96: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Curses#include <curses.h>int main(void){ int x, y; initscr(); getmaxyx(stdscr, y, x); printw("Cantidad de lineas=%d\n", y); printw("Cantidad de columnas=%d\n", x); refresh(); sleep(3); endwin(); return 0;}

Page 97: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Curses/*Programa que crea una nueva terminal

con Ncurses */#include <stdlib.h>#include <curses.h>int main(void){ SCREEN *ventana; if((ventana=newterm(NULL, stdout, stdin))

== NULL){ perror("Error al crear nueva terminal"); exit(EXIT_FAILURE); }

Page 98: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Curses if(set_term(ventana) == NULL{ endwin(); delscreen(ventana); perror("Error al inicializar ventana"); exit(EXIT_FAILURE); }

printw("Esta ventana de ncurses ha sido creada con newterm\n");

refresh(); sleep(3);

Page 99: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Curses• printw("Terminar ahora la ventana\n"); • refresh(); • sleep(3); • endwin(); • delscreen(ventana); • exit(0);}

• Las ventanas de ncurses de manera predetermina se desaparecen.

Page 100: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Ncurses/* Funciones de ncurses para la salida de

caracteres */#include <stdlib.h>#include <curses.h>#include <errno.h>int main(void){ SCREEN *ventana; if((ventana=newterm(NULL, stdout,

stdin)) == NULL){ perror("Error al crear nueva terminal");

exit(EXIT_FAILURE); }

Page 101: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Ncursesif(set_term(ventana) == NULL){ endwin(); delscreen(ventana); perror("Error al inicializar ventana"); exit(EXIT_FAILURE); }

addch('X'); addch('Y' | A_REVERSE); mvaddch(2, 1, 'Z' | A_BOLD); refresh();

Page 102: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

NCursessleep(3); clear(); waddch(stdscr, 'X'); waddch(stdscr, 'Y' | A_REVERSE); mvwaddch(stdscr, 2, 1, 'Z' | A_BOLD); refresh(); sleep(3); endwin(); delscreen(ventana); return 0;}

Page 103: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

NCurses/* Funciones de cadenas en Ncurses */#include <stdlib.h>#include <curses.h>#include <errno.h>int main(void){ int xmax, ymax; WINDOW *ventana_temp; SCREEN *ventana; if((ventana=newterm(NULL, stdout, stdin))

== NULL){

Page 104: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

NCurses perror("Error al crear nueva terminal"); exit(EXIT_FAILURE); } if(set_term(ventana) == NULL){ endwin(); delscreen(ventana); perror("Error al inicializar ventana"); exit(EXIT_FAILURE); } getmaxyx(stdscr, ymax, xmax); addstr("Ejemplo de cadena agregada\n"); hline(ACS_HLINE, xmax);

Page 105: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

NCursesmvaddstr(3, 0, "Esta cadena aparecerá

completa\n"); mvaddnstr(5, 0, "Esta cadena aparecera

truncada\n", 20); refresh(); sleep(3); if((ventana_temp = newwin(0, 0, 0, 0)) ==

NULL){ perror("Error al crear la subventana");

exit(-1); }

Page 106: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

NCurses• mvwaddstr(ventana_temp, 1, 1, "Este

mensaje aparece en una subventana"); • /*worded(ventana_temp, 0, 0, 0, 0, 0, 0,

0, 0);*/ • touchwin(ventana_temp); • wrefresh(ventana_temp); • sleep(3); • delwin(ventana_temp); • endwin(); • delscreen(ventana); return 0;}

Page 107: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

NCurses/*Ejemplo de trazado de líneas y cuadros */#include <stdlib.h>#include <curses.h>#include <errno.h>int main(){ int ymax, xmax; SCREEN *ventana; if((ventana=newterm(NULL, stdout, stdin))

== NULL){

Page 108: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

NCurses• perror("Error al crear nueva terminal"); • exit(EXIT_FAILURE); } • if(set_term(ventana) == NULL){ • endwin(); • delscreen(ventana); • perror("Error al inicializar ventana"); • exit(EXIT_FAILURE); } • getmaxyx(stdscr, ymax, xmax); • mvaddch(0, 0, ACS_ULCORNER); • hline(ACS_HLINE, xmax -2);

Page 109: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

NCursesmvaddch(ymax-1, 0, ACS_LLCORNER); hline(ACS_HLINE, xmax-2); mvaddch(0, xmax-1, ACS_URCORNER);

vline(ACS_VLINE, ymax -2); mvvline(1, xmax -1, ACS_VLINE, ymax-2); mvaddch(ymax-1, xmax-1,

ACS_LRCORNER); mvprintw(ymax / 3 -1, (xmax -30) /2,

"Borde manual"); refresh(); sleep(3);

Page 110: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

NCursesclear(); box(stdscr, ACS_VLINE, ACS_HLINE); mvprintw(ymax / 3 -1, (xmax -30) /2,

"Borde con box"); refresh(); sleep(3); clear();

Page 111: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

NCurseswborder(stdscr, ACS_VLINE | A_BOLD,

ACS_VLINE | A_BOLD, ACS_HLINE | A_BOLD, ACS_HLINE | A_BOLD, ACS_ULCORNER | A_BOLD, ACS_URCORNER | A_BOLD, ACS_LLCORNER | A_BOLD, ACS_LRCORNER | A_BOLD);

mvprintw(ymax / 3 -1, (xmax - 25) /2, "Borde con wborder");

refresh(); sleep(3); endwin(); delscreen(ventana); return 0;}

Page 112: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

NCurses• wborder(stdscr, ACS_VLINE | A_BOLD,

ACS_VLINE | A_BOLD, ACS_HLINE | A_BOLD, ACS_HLINE | A_BOLD, ACS_ULCORNER | A_BOLD, ACS_URCORNER | A_BOLD, ACS_LLCORNER | A_BOLD, ACS_LRCORNER | A_BOLD); mvprintw(ymax / 3 -1, (xmax - 25) /2, "Borde con wborder"); refresh(); sleep(3); endwin(); delscreen(ventana); return 0;}

Page 113: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

NCurses/* Ingreso de Caracteres en Ncurses */#include <stdlib.h>#include <curses.h>#include <errno.h>int main(void){ int c, i = 0, xmax, ymax; char cadena[80]; WINDOW *puntero_ventana; SCREEN *ventana;

Page 114: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

NCursesif((ventana=newterm(NULL, stdout, stdin))

== NULL){ perror("Error al crear nueva terminal"); exit(EXIT_FAILURE); } if(set_term(ventana) == NULL){ endwin(); delscreen(ventana); perror("Error al inicializar ventana"); exit(EXIT_FAILURE); } crmode();

Page 115: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

NCursesgetmaxyx(stdscr, ymax, xmax); if((puntero_ventana=subwin(stdscr, 3, 40,

ymax / 3, (xmax -40) /2)) == NULL){ perror("Error al crear la subventana"); exit(-1); } box(puntero_ventana, ACS_VLINE,

ACS_HLINE); mvwaddstr(puntero_ventana, 1, 1,

"Contraseña: "); noecho(); while((c = getch()) != '\n' && i < 80){

Page 116: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

NCursescadena[i++]=c; waddch(puntero_ventana, '*'); wrefresh(puntero_ventana); } echo(); cadena[i]= '\0'; wrefresh(puntero_ventana); mvwprintw(puntero_ventana, 1, 1, "Se

introdujo: %s\n", cadena); box(puntero_ventana, ACS_VLINE,

ACS_HLINE);

Page 117: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

NCurseswrefresh(puntero_ventana); sleep(3); endwin(); delscreen(ventana); return 0;

Page 118: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

NCurses/* Funciones para el ingreso de cadenas en

Ncurses */#include <stdlib.h>#include <curses.h>#include <errno.h>#include <string.h>#define TAM 20int main(int argc, char *argv[]){ int c, i=0; char cadena[TAM];

Page 119: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

NCursesSCREEN *ventana; if((ventana=newterm(NULL, stdout, stdin))

== NULL){ perror("Error al crear nueva terminal"); exit(EXIT_FAILURE); } if(set_term(ventana) == NULL){ endwin(); delscreen(ventana); perror("Error al inicializar ventana");

exit(EXIT_FAILURE); }

Page 120: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

NCursescrmode(); printw("Introduce tu nombre?"); refresh(); getnstr(cadena, TAM); printw("Tu nombre es: %s\n", cadena); refresh(); sleep(3); endwin(); delscreen(ventana); return 0;}

Page 121: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Lenguajes Interpretados

• Un lenguaje interpretado es aquel que permite ejecutarse línea por línea. Generalmente se hace a través de un software que permita realizar múltiples acciones.

• Ejemplos de lenguajes interpretados son HTML, Visual Basic ScriptHost, las macros de Office, los lenguajes de configuración, los archivos por lotes entre muchas aplicaciones.

Page 122: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación del Shell en Unix

• Este es un ejemplo de lenguaje interpretado, en el cual se pueden utilizar todos los comandos del sistema y llamar a una aplicación.

• Se pueden meter más de un comando en la shell en la misma línea si se separan por medio de “;”. Por ejemplo: $ cls; ls

• Borrará y listará el directorio actual.

Page 123: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación del Shell en Unix

• Los programas del shell se escriben en editores de texto plano como vi y emacs.

• Se ejecutan con el comando sh (bash o como se llame el shell utilizado), seguido del nombre del archivo del script. O bien, se pueden ejecutar firmándolos con la instrucción:

• #!/bin/sh

Page 124: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación del Shell en Unix

• Los comentarios inician con el carácter #

• Los scripts de la shell se utilizan para arrancar demonios, inicializar servicios, administrar aplicaciones, etc.

• Se utilizan algunas variables especiales en el sistema como:

• $1 - $9 parámetros

Page 125: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación del Shell

• $0 nombre del comando actual • $# número de parámetros

$? status del último comando ejecutado dado como un string decimal.

$$ el número de proceso de este shell

$! el pid del último comando ejecutado en background.

Page 126: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación del Shell en Unix

• $- las opciones actuales suministradas para esta invocación del shell.

• • $* $@@ un string que contiene todos los

argumentos del shell comenzando por el $1.

• Para imprimir variables y mensajes se utiliza echo

• El operador test [] sirve para evaluar expresiones lógicas, las cuales utilizan los caracteres: &&, ||, para la and y or respectivamente.

Page 127: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación del Shell en Linux

• En la shell se utilizan algunos caracteres especiales como:– ‘’ Literal simple– `` Sustituir valor de la variable– “” Sustituir por lo que haya en las comillas

• Se utilizan otras instrucciones como Shift para avanzar parámetros.

• Para leer datos se utiliza la instrucción read.

Page 128: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación del Shell en Linux

• El operador test tiene los siguientes argumentos

• -d directorio • -e archivo sin importar el tipo • -f archivo normal • -r leer archivo • -s tamaño mayor que 0 • -w escribir archivo• -x archivo ejecutable • -eq iguales • -ne no son iguales

Page 129: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación del Shell en Linux

• -gt mayor • -ge mayor o igual • -lt menor • -le menor o igual • = cadenas idénticas • != cadenas no son idénticas • < menor • > mayor • -n longitud de la cadena de texto es

distinta de cero

Page 130: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación del Shell en Linux

• ! Negación• -a and• -o or

• Se puede declarar funciones de la forma:

• _nombre_funcion_ () { _lista_de_ordenes_ }

Page 131: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación del Shell en Linux

• La estructura de decisión tiene el siguiente formato:

• if ....; • then .... • elif ....; • then .... • else .... • fi

Page 132: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación del Shell en Linux

• [ -f "/etc/shadow" ] && echo "Este ordenador usa shadow passwors"

• Estas líneas de código revisan si existe el archivo /etc/shadow y si existe muestran un mensaje de confirmación.

• Nótese que los paréntesis van separados por un espacio en blanco. El lenguaje es muy sensible a ciertos caracteres.

Page 133: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación del Shell en Linux

• La estructuras de decisión múltiple pueden ser de la forma:

case ... in ...)

hacer algo aquí;; esac

• Generalmente las variables tienen asociados el símbolo de $.

Page 134: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación del Shell en Linux

• Las estructuras de repetición tienen los siguientes formatos:

while ...; do .... done

for var in ....; do .... done

Page 135: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación del Shell en Linux

• El operador ; se utiliza en algunas instrucciones para indicar que su uso aun continua en la siguiente línea.

• A continuación se presentan algunos ejemplos de programas hechos en la shell.

Page 136: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación del Shell en Linux

#!/bin/sh #Programa que verifica el tipo de shellif [ "$SHELL" = "/bin/bash” ]; then

echo "tu shell es el bash (bourne again shell)“

else echo "tu shell no es bash sino $SHELL"

fi

Page 137: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación del Shell en Linux

#!/bin/shtest -x /home/www/bin/httpd || exit 0

case "$1" in #cuál fue el parámetro de invocación

start)echo -n "Iniciando servidor http"start-stop-daemon --start --quiet --pidfile /var/run/httpd.pid \--exec /home/www/bin/httpdecho "."

;;stop)

echo -n "Deteniendo servidor httpd"start-stop-daemon --stop --quiet --pidfile /var/run/httpd.pidecho "."

;;

Page 138: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación del Shell en Linux

restart)/etc/init.d/httpd stopsleep 2/etc/init.d/httpd startecho "."

;;*)

echo "Uso: /etc/init.d/httpd {start|stop|restart}"exit 1

esacexit 0

Page 139: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación del Shell en Linux

#!/bin/sh#Shell que crea un usuario pasando el nombre como

parámetro asi como su directorio public html

if [ $# -eq 1 ]then #creamos el nuevo usuario

useradd $1mkdir /home/$1cd /home/$1mkdir public_html

elseecho "!Sintaxis incorrecta!. Uso correcto: $0 nombre_usuario"

fi

Page 140: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación del Shell de Linux

• Realizar un script que permita determinar cuantos compiladores existen en el sistema e indicarle al usuario que tan geek es en computación. Por ejemplo se definen lenguajes como c, python, perl, pascal, ada y se buscan dichos archivos en el sistema. Se contabiliza el total, se saca una proporción, si se tienen 5 de 7 elementos por ejemplo: indicar que se es buen programador, 1/7 novato, etc.

Page 141: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

Programación del Shell en Linux

• Uno de los ataques más comunes consiste en suplantar los comandos y programas más utilizados de la ruta de path de tal forma que se ejecuten antes de tiempo. Realizar un programa que permita buscar archivos replicados en el sistema operativo e indicar su ruta.

• Si el usuario introduce algo como $buscar python debe encontrar todos los archivos que se llamen python en el sistema.

Page 142: Programación Procedural M.C. Juan Carlos Olivares Rojas jolivares@uvaq.edu.mx jcolivar Agosto, 2009.

¿Preguntas, dudas y comentarios?