Beruflich Dokumente
Kultur Dokumente
ESPOCH
BIBLIOGRAFA
Internetworking with TCP/IP, volumes I- III Douglas Comer and David Stevens - Prentice
Hall
By ordering
Network byte order y Host byte order son
dos formas en las que el sistema puede
almacenar
los
datos
en
memoria.
Est relacionado con el orden en que se
almacenan los bytes en la memoria RAM.
By ordering
Si al almacenar un short int (2 bytes) o un
long int (4 bytes) en RAM, en la posicin ms
alta se almacena el byte menos significativo,
entonces est en network byte order, caso
contrario es host byte order
By ordering
Esto depende del microprocesador que se est
utilizando, podramos estar programando en
un sistema host byte order o network byte
order, pero cuando enviamos los datos por la
red deben ir en un orden especificado, sino
enviaramos todos los datos al revs. Lo
mismo sucede cuando recibimos datos de la
red, debemos ordenarlos al orden que utiliza
nuestro sistema.
By ordering
Debemos cumplir las siguientes reglas :
Todos
By ordering
Funciones de conversin
htons()
Funciones de conversin
ntohs()
Funciones de conversin
Puede ser que el sistema donde se est
programando almacene los datos en network
byte order y no haga falta realizar ninguna
conversin, pero si tratamos de compilar el
mismo cdigo fuente en otra plataforma host
byte order no funcionar.
Funciones de conversin
Como conclusin, para que nuestro cdigo
fuente sea portable se debe utilizar siempre las
funciones de conversin.
Para ms informacin : man 3 byteorder
Multiplexacin
La multiplexacin es la combinacin de dos o
ms canales de informacin en un solo medio
de transmisin usando un dispositivo llamado
multiplexor. El proceso inverso se conoce
como demultiplexacin. Un concepto muy
similar es el de control de acceso al medio.
Multiplexacin
Nuevamente si al almacenar un short int (2
bytes) o un long int (4 bytes) en RAM, en la
posicin ms alta se almacena el byte menos
significativo, entonces est en network byte
order, caso contrario es host byte order
Multiplexacin
Existen muchas estrategias de multiplexacin
segn el protocolo de comunicacin
empleado, que puede combinarlas para
alcanzar el uso ms eficiente; los ms
utilizados son:
La
Multiplexacin
La
Multiplexacin
Cuando existe un esquema o protocolo de
multiplexacin pensado para que mltiples
usuarios compartan un medio comn, como
por ejemplo en telefona mvil o WiFi, suele
denominarse control de acceso al medio o
mtodo de acceso mltiple. Como mtodos
de acceso mltiple destacan:
Multiplexacin
El
Direccionamiento
Cada
Programas y procesos
Un
Un
10
Cliente - Servidor
Un
servidor
dispositivo.
es
un
proceso,
no
un
Un
Time-of-day
Servidor
de archivos
Servidor
de impresin
Servidor
de acceso a disco
Servidor
de transacciones
11
Servidor
Los
Es el servidor que
maneja varios cliente a la vez
API,
Network Application Programing
Interface
Son los servicio provedos a menudo por el
sistema operativo que proporcionan una
interfaz entre las aplicaciones y el protocolo
de software.
Grupo de procedimientos que puede usar un
programa de aplicacin para comunicarse por
una red. El nombre se debe a que el grupo
incluye un procedimiento socket que debe
llamarse para establecer la comunicacin
12
API,
Network Application Programing
Interface
API Network
Caractersticas
Interface
genrica de programacin
Soporte para orientacin de mensajes y
comunicaciones orientadas a conexin.
Servicios de entrada/salida
Independencia del sistema operativo
Servicios para la Capa de Presentacin
13
API Genrica
Caractersticas
Soporte
Estructura de un programa en C
14
Estructura de un programa en C
Estructura de un programa en C
#include<stdio.h>
/*programa para calcular el area de un circulo*/
Main()
{
Float radio, area;
Printf(Radio = ?);
Scanf(%f, &radio);
Area=3.1416*radio*radio;
Printf(Area = %f,area);
}
15
Tipos de Datos
Int:
char c;
c= getchar();
Putchar();
Visualizar un carcter. Tx un
carcter al dispositivo de salida estndar.
char c;
putchar(c);
16
17
Socket
Es una interfaz de entrada-salida de datos que
permite la intercomunicacin entre procesos.
Es
una representacin abstracta de una
comunicacin.
Los procesos pueden estar ejecutndose en el
mismo o en distintos sistemas, unidos mediante
una red.
18
Socket
de
Sockets
19
Sockets
Para conectarse con un df a travs de internet se
usa la llamada al sistema socket(). Esta devuelve
un descriptor de fichero y se puede comunicar
con l usando las llamadas al sistema
especializadas send() y recv() ( man send , man
recv ).
20
Dominios de comunicacin.
Los sockets se crean dentro de un dominio de
comunicacin, igual que un archivo se crea
dentro de un filesystem. El dominio de
comunicacin nos dice donde se encuentran los
procesos que se van a intercomunicar.
Si los procesos estn en el mismo sistema, el
dominio de comunicacin ser AF_UNIX, si los
procesos estn en distintos sistemas y estos se
hallan unidos mediante una red TCP/IP, el
dominio de comunicacin ser AF_INET.
21
Dominios de comunicacin.
Los sockets no se han diseado solamente para
TCP/IP. La idea original fue que se usase la
misma interfaz tambin para distintas familias de
protocolos.
Algunos dominios:
Tipos de Sockets
Existen varios tipos de sockets:
- DARPA, sock de internet
- sock de unix
- sock x.25
2 tipos de Sock de internet.
El primer tipo de sockets lo definen los sockets de flujo
[Stream sockets];
El otro, los sockets de datagramas [Datagram sockets],
22
Tipos de Sockets
"SOCK_STREAM" y "SOCK_DGRAM ".
En ocasiones, a los sockets de datagramas se les
llama tambin "sockets sin conexin". (Aunque
se puede usar connect() con ellos, si se quiere).
Sockets Stream.
Sockets Datagram.
Sockets Raw.
23
Sockets Stream
Sockets Datagram
24
Sockets Datagram
Se llaman tambin sockets sin conexin, porque
no hay que mantener una conexin activa, como
en el caso de sockets stream.
Son utilizados para transferencia de informacin
paquete por paquete. Ejemplo: dns, tftp, bootp,
etc.
Ellos implementan un protocolo encima de UDP
que realiza control de errores.
La especificacion del protocolo UDP se puede
leer en la RFC-768.
Sockets Raw
25
Sockets de Conexin
26
Resumen
Todo lo que se hace con los sockets de flujo es usar
send() para enviar datos.
Para los sockets de datagramas se tiene que encapsular el
paquete segn el mtodo de eleccin y se enva usando
sendto(). El ncleo implementa los niveles de Internet y de
Transporte para que sea transparente, y el hardware el
nivel de acceso a la red.
27
Creando un Socket
Los sockets se crean llamando a la funcin
socket(), esta funcin retorna un descriptor
de socket, que es tipo int.
Si hubo algn error, socket() retorna -1 y la
variable global errno se establece con un valor
que indica el error que se produjo
Creando un Socket
28
Creando un Socket
29
30
Direccionamiento genrico
Estructura sockaddr
Almacenan el nombre del socket. Se utilizan con la funcin
bind(). Una direccin que me permite usar sockets para
comunicarme con subprocesos(hijos).
struct sockaddr
{
unsigned short sa_family; // AF_*
char sa_data[14]; // Direccin de protocolo.
};
31
Estructura sockaddr_in
Almacenan el nombre del socket. Se utilizan con la funcin
bind().
struct sockaddr_in
{
short int sin_family; // AF_INET
unsigned short sin_port; // Numero de puerto.
struct in_addr sin_addr; // Direccin IP.
unsigned char sin_zero[8]; // Relleno.
};
32
Estructura sockaddr_in
Estructura sockaddr_in
33
AF_INET
Para PF_INET se necesitan:
34
Nuevamente estructuras
Network Byte Order
Nuevamente estructuras
Network Byte Order
Todos los valores almacenados en la estructura sockaddr_in
deberan estar en network byte order
35
Nuevamente estructuras
Network Byte Order
Consecuentemente
sockaddr_in.
se
usan
las
estructuras
36
37
38
39
40
41
42
RESUMEN
43
44
45
46
47
Descripcin de funciones
listen ()
Se llama desde el servidor, habilita el socket para que pueda recibir
conexiones. Solo se aplica a sockets tipo SOCK_STREAM.
int listen ( int sockfd, int backlog)
sockfd : Es el descriptor de socket devuelto por la funcin socket()
que ser utilizado para recibir conexiones.
backlog : Es el nmero mximo de conexiones en la cola de entrada
de conexiones. Las conexiones entrantes quedan en estado de espera
en esta cola hasta que se aceptan ( accept () ).
Descripcin de funciones
accept()
Se utiliza en el servidor, con un socket habilitado para recibir
conexiones ( listen() ). Esta funcin retorna un nuevo descriptor de
socket al recibir la conexin del cliente en el puerto configurado.
La llamada a accept() no retornar hasta que se produce una
conexin
o
es
interrumpida
por
una
seal.
int accept ( int sockfd, void *addr, int *addrlen)
48
Descripcin de funciones
accept()
sockfd : Es el descriptor de socket habilitado para recibir
conexiones.
addr : Puntero a una estructura sockadd_in. Aqu se almacenar
informacin de la conexin entrante. Se utiliza para determinar que
host est llamando y desde qu nmero de puerto.
addrlen : Debe ser establecido al tamao de la estructura sockaddr.
sizeof(struct sockaddr).
accept() no escribir ms de addrlen bytes en addr . Si escribe
menos bytes, modifica el valor de addrlen a la cantidad de bytes
escritos.
Ejemplo:
Descripcin de funciones
...
int sockfd, new_sockfd;
struct sockaddr_in my_addr;
struct sockaddr_in remote_addr;
int addrlen;
...
//Creo el socket
sockfd = socket (AF_INET, SOCK_STREAM, 0 );
...
// Se le asigna un nmero de puerto al socket por donde el servidor escuchar.
// Antes de llamar a bind() se debe asignar valores a my_addr.
bind (sockfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr) );
// Se habilita el socket para poder recibir conexiones.
listen ( sockfd, 5);
addrlen = sizeof (struct sockaddr );
...
// Se llama a accept() y el servidor queda en espera de conexiones.
new_sockfd = accept ( sockfd, &remote_addr, &addrlen);
49
Descripcin de funciones
connect()
Inicia la conexin con el servidor remoto, lo utiliza el cliente para
conectarse.
Descripcin de funciones
send() y recv()
Despus de establecer la conexin, se puede comenzar con la
transferencia de datos.
Estas dos funciones son para realizar transferencia de datos sobre
sockets stream.
send() y recv() son idnticas a write() y read(), excepto que se agrega
un parmetro.
50
Descripcin de funciones
send()
send ( int sockfd, const void *msg, int len, int flags )
sockfd : Descriptor socket por donde se enviarn los datos.
msg : Puntero a los datos a ser enviados.
len : Longitud de los datos en bytes.
flags : Banderas/Leer: man 2 send
send() retorna la cantidad de datos enviados, la cual podr ser menor
que la cantidad de datos que se escribieron en el buffer para enviar .
send() enviar la mxima cantidad de datos que pueda manejar y
retorna la cantidad de datos enviados, es responsabilidad del
programador comparar la cantidad de datos enviandos con len y si
no se enviaron todos los datos, enviarlos en la prxima llamada a
send().
Descripcin de funciones
recv()
recv ( int sockfd, void *buf, int len, unsigned int flags )
sockfd : Descriptor socket por donde se recibirn los datos.
buf : Puntero a un buffer donde se almacenarn los datos recibidos.
len : Longitud del buffer buf.
flags : Banderas/Leer: man 2 recv
Si no hay datos a recibir en el socket , la llamada a recv() no retorna
(bloquea) hasta que llegan datos, se puede establecer al socket como
no bloqueante (fcntl ) de manera que cuando no hay datos para
recibir la funcin retorna -1 y establece la variable
errno=EWOULDBLOCK, recv() retorna el nmero de bytes
recibidos.
51
Descripcin de funciones
sendto() y recvfrom()
Funciones para realizar transferencia de datos sobre sockets
datagram
Descripcin de funciones
sendto()
int sendto(int sockfd, const void *msg, int len, unsigned int
flags, const struct sockaddr *to, int tolen)
sockfd : Descriptor socket por donde se enviarn los datos.
msg : Puntero a los datos a ser enviados.
len : Longitud de los datos en bytes.
flags : Banderas/Leer: man 2 sendto
to : Puntero a una estructura sockaddr que contiene la direccin IP y
nmero de puerto destino.
tolen : Debe ser inicializado al tamao de struct sockaddr
( sizeof (struct sockaddr) ).
sendto() retorna el nmero de bytes enviados, el cual puede ser
menor que len, igual que en send
52
Descripcin de funciones
recvfrom()
int recvfrom ( int sockfd, void *buf, int len, unsigned int flags, struct
sockaddr *from, int *fromlen )
sockfd : Descriptor socket por donde se recibirn los datos.
buf : Puntero a un buffer donde se almacenarn los datos recibidos.
len : Longitud del buffer buf.
flags : Banderas
from : Puntero a una estructura sockaddr que contiene la direccin IP y nmero
de puerto del host origen de los datos.
fromlen : Debe ser inicializado al tamao de struct sockaddr
( sizeof (struct sockaddr) ).
Si no hay datos a recibir en el socket , la llamada a recvfrom() no retorna (bloquea)
hasta que llegan datos, se puede establecer al socket como no bloqueante (fcntl )
de manera que cuando no hay datos para recibir la funcin retorna -1 y establece
la variable errno=EWOULDBLOCK, recvfrom() retorna el numero de bytes
recibidos, igual que recv().
Descripcin de funciones
close () y shutdown ()
Finalizan la conexin del descriptor de socket.
close ( sockfd)
Despus de utilizar close, el socket queda deshabilitado para realizar lecturas o
escrituras.
53
Paso de argumentos
Paso de argumentos
{
des.sin_family = AF_INET;
des.sin_addr.s_addr = inet_addr(argv[1]);
des.sin_port = htons(atoi(argv[2]));
Para correr
Gcc nombre.c o nombre(creo el archivo ejecutable)
./nombre IP destino puerto mensaje
./ argv 0 argv 1
argv2 argv3
54
GETHOSTNAME()
La funcin gethostname () devuelve el nombre del ordenador
sobre el que tu programa se est ejecutando. El nombre puede
usarse entonces con gethostbyname(), para determinar la
direccin IP de tu mquina local.
#include <unistd.h>
int gethostname(char *hostname, size_t size);
Los argumentos son sencillos: hostname es un puntero a una
cadena de caracteres donde se almacenar el nombre de la
mquina cuando la funcin retorne, y size es la longitud en bytes
de esa cadena de caracteres.
gethostname () retorna 0 si se ejecuta con xito.
55
struct hostent()
struct hostent *gethostbyname (const char *name)
Se utiliza para convertir un nombre de un host a su direccin IP,
sea utiliza el servidor de nombres.
Ejemplo: Supongamos que estamos programando un cliente
telnet.
$ telnet algun.sitio.com
La aplicacin cliente primero debe trasladar el nombre del sitio
(algun.sitio.com) a conectarse a su direccin IP, para luego poder
realizar todos los pasos de conexin anteriormente descritos.
Retorna un puntero a una estructura hostent, que esta formada
como sigue:
struct hostent()
struct hostent
{
char *h_name;
char **h_aliases;
int h_addrtype;
int h_length;
char **h_addr_list;
};
#define h_addr h_addr_list[0]
En el caso de producirse algun error devuelve NULL y establece
la variable h_errno con el numero de error, en vez de la variable
errno ( ver man herror)
56
struct hostent()
Descripcion de los campos de la estructura hostent:
h_name : Nombre oficial del host.
h_aliases : Array de nombres alternativos.
h_addrtype : Tipo de direccin que se retorno ( AF_INET ).
h_length : Longitud de la direccin en bytes.
h_addr_list : Array de direcciones de red para el host.
h_addr : La primer direccin en h_addr_list.
Resumen
57
58
59
#include <sys/types.h>
#include <sys/socket.h>
int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
60
61
SEND() Y RECV()
Estas dos funciones sirven para comunicarse a travs de
sockets de flujo o sockets de datagramas conectados. Si quieres usar
sockets de datagramas desconectados normales se tiene que usar sendto
() y recvfrom ().
La llamada al sistema send():
int send(int sockfd, const void *msg, int len, int flags);
char *msg = Hola!";
int len, bytes_sent;
len = strlen(msg);
bytes_sent = send(sockfd, msg, len, 0);
62
SEND() Y RECV()
La llamada al sistema recv() es similar en muchos aspectos:
int recv(int sockfd, void *buf, int len, unsigned int flags);
sockfd es el descriptor del fichero del que se va a leer, buf es el buffer donde se
va a depositar la informacin leida, len es la longitud mxima del buffer, y
flags, que puede asignarse a 0.
SENDto() Y RECVfrom()
Puesto que los sockets de datagramas no estn conectados a una mquina
remota, para enviar un paquete debemos especificar la direccin de destino!
Asi:
int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct
sockaddr *to, int tolen);
la misma que send() aadiendo dos items ms de informacin. to
es un puntero a una estructura struct sockaddr que contiene la direccin IP y
el puerto de destino. Al argumento tolen asgnale el valor sizeof(struct
sockaddr).
63
SENDto() Y RECVfrom()
La misma semejanza presentan recv() y recvfrom(). La sinopsis de
recvfrom() es:
int recvfrom(int sockfd, void *buf, int len, unsigned int flags,
struct sockaddr *from, int *fromlen);
De nuevo, es igual que recv() pero con dos argumentos ms. from
es un puntero a una estructura struct sockaddr local que ser rellenada con la
direccin IP y el puerto de la mquina de origen. fromlen es un puntero a un
int local que tiene que inicializarse a sizeof(struct sockaddr).
close() y shutdown()
Hasta ahora se ha utilizado (send()) para enviar y se ha estado
recibiendo con (recv() ) datos. Para cerrar la conexin de tu
descriptor de socket, hay que usar normalmente la funcin Unix
close() que cierra descriptores de fichero:
close(sockfd);
Slo en el caso que quieras un poco ms de control sobre cmo
se cierra el socket puedes usar la funcin shutdown(). Te permite cortar la
comunicacin en un cierto sentido, o en los dos (tal y como lo hace close())
64
close() y shutdown()
int shutdown(int sockfd, int how);
sockfd es el descriptor de socket que quieres desconectar, y how es uno de los siguientes
valores:
0 -- No se permite recibir ms datos
1 -- No se permite enviar ms datos
Ejemplo cliente-servidor
TCP simple
Luego del accept() el servidor queda
en estado de espera hasta que el
cliente intente conectarse.
El cliente trata de conectarse con
connect(); accept() retorna con un
nuevo descriptor de socket, el cual es
utilizado por el server para realizar la
transferencia de datos con el cliente.
Mientras esta realizando transferencia
de datos con un cliente, los intentos
de conexin de otros clientes son
almacenados en una cola de
conexiones, que luego ser atendida.
Los clientes se atienden de a uno por
vez en este tipo de aplicacin clienteservidor.
65
66
Sockets no bloqueantes
Supongamos que creamos un socket y nos conectamos a un
servidor, sabemos que el socket nos provee una comunicacin
bidireccional, podemos enviar y recibir datos simultneamente.
Llamamos a la funcin recv() para recibir datos, pero el servidor
en ese momento no tiene nada para enviarnos, entonces la funcin
recv() no retorna. Justo en ese momento queremos enviar datos
hacia el servidor, pero no podemos porque la funcin recv() no
retorno y nos bloqueo el programa.
Debemos encontrar alguna forma para que la funcin recv()
retorne aunque el servidor no envi nada. Esto se realiza
estableciendo al socket como no bloqueante.
67
Sockets no bloqueantes
Sockets no bloqueantes
Ejemplo:
#include <unistd.h>
#include <fcntl.h>
...
sockfd=socket(AF_INET, SOCK_STREAM, 0);
fcntl (sockfd, F_SETFL, O_NONBLOCK);
...
Una vez establecido el socket como no bloqueante, se puede llamar
a la funciones bloqueantes como recv() para recibir datos, si no hay
datos
disponibles
recv()
devuelve
-1
y
establece
errno=EWOULDBLOCK. Se puede ir consultando (polling) el
socket para saber si hay datos disponibles, pero esta no es una
solucin muy buena, se consume tiempo de CPU consultando al
socket si tiene datos. Consecuentemente se usa la Funcin select()
68
select()
select()
Se proveen 4 macros para manejar los conjuntos de descriptores :
FD_ZERO ( fd_set *set ): limpia un conjunto de descriptores.
FD_SET ( int fd, fd_set *set ): agrega fd a un conjunto.
FD_CLR ( int fd, fd_set *set ): borra fd de un conjunto.
FD_ISSET ( int fd, fd_set *set ): Verifica si fd esta dentro de un
conjunto. Se utiliza luego del retorno de select() para verificar cual
descriptor cambio su estado.
69
select()
select()
Veamos la estructura timeval que es utilizada para definir un tiempo
de espera para la lectura o escritura de datos. Quizs cada 96
segundos se quiera imprimir "An estoy vivo..." aunque no haya
sucedido nada. Esta estructura de tiempo te permite establecer un
perodo mximo de espera.
Si transcurre ese tiempo y select() no ha encontrado an ningn
descriptor de fichero que est listo, la funcin regresar para que se
pueda seguir procesando.
struct timeval
{
int tv_sec;
int tv_usec;
};
/* segundos */
/* micro segundos */
70
select()
Ejemplo : Monitoreamos la entrada estandard ( descriptor 0 )
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#define STDIN 0
/* descriptor para la entrada estandard */
main()
{
struct timeval timeout;
fd_set readfds;
timeout.tv_sec = 2;
timeout.tv_usec = 500000 ;
FD_ZERO ( &readfds );
FD_SET ( STDIN, &readfds );
select ( STDIN+1, &readfds, NULL, NULL, &timeout );
if ( FD_ISSET ( STDIN, &readfds ) )
printf (" Se oprimio una tecla\n");
else
printf(" se vencio el tiempo\n");
}
(THREADS)
Un thread es un concepto sencillo: un simple flujo de control
secuencial. Con un nico thread existe en cualquier instante un
nico punto de ejecucin. El programador no necesita aprender
nada nuevo para programar un nico thread.
Sin embargo cuando se tienen mltiples hilos en un programa
significa que en cualquier instante el programa tiene mltiples
puntos de ejecucin, uno en cada uno de sus threads. El
programador decide cuando y donde crear mltiples threads,
ayudndose de una librera o paquete en tiempo de ejecucin
Ahora veremos cmo usar mltiples hebras o hilos de control
para efectuar mltiples tareas dentro de un mismo proceso. Un
aspecto ineludible al hablar de compartir recursos son los
mecanismos de sincronizacin necesarios para conservar la
consistencia de los recursos compartidos.
71
(THREADS)
Uno de los problemas que se tenia al utilizar mltiples threads de ejecucin
es que hasta hace poco no exista un estndar para ello la extensin Posix1.c
se aprob en junio de 1995 con la adopcin de un estndar Posix para los
hilos, se estn haciendo mas comunes las aplicaciones con Threads.
Todas las fuentes que empleen Posix, deben incluir el archivo de
encabezado pthread.h con la directiva
(THREADS)
Por ejemplo la forma mas usual de hacer lo anterior, si estamos usando un
compilador GNU como gcc, es el comando:
72
(THREADS)
(THREADS)
Las operaciones llevadas a cabo sobre un hilo son:
Creacin y destruccin
Sincronizacin entre hilos
Posibilidad de disponer para cada thread memoria local propia
Gestin de prioridades entre hilos
Gestin de seales
73
(THREADS)
Un thread tiene identificador (ID), una pila, una prioridad de ejecucin
y una direccin de inicio de ejecucin:
Administracin de Hilos
Un paquete de manejo de hilos generalmente incluye funciones para:
crear y destruir un hilo, itineracin, forzar exclusin mutua y espera
condicionada.
Los hilos de un proceso comparten variables globales, descriptores de
archivos abiertos, y pueden cooperar o interferir con otros hilos.
(THREADS)
Todas las funciones de hilos del POSIX comienzan con pthread. Entre ellas estn:
74
(THREADS)
Identificacin de Hilos
As como un proceso tiene un PID (Process Identification), cada hilo
tiene un identificador de hilo. Mientras los PID son enteros no
negativos, el ID de un hilo es dependiente del SO y puede ser una
estructura.
(THREADS)
Creacin de Hilos
Los procesos normalmente corren como un hilo nico. La creacin
de un nuevo hilo se logra va pthread_create.
Nota: restrict es una palabra reservada para sealar al compilador que el dato
referenciado slo ser accedido en la funcin a travs de ese puntero.
75
(THREADS)
Creacin de Hilos
El hilo principal debe dormir para asegurar que el hilo logre hacer
su parte. El hilo nuevo debe llamar a pthread_self() porque no hay
garanta que el valor pasado por el hilo principal lo tenga. Todo
esto por desconocer qu hilo corre primero.
Trmino de un Hilo
Si un hilo invoca a exit, _Exit o _exit, todo el proceso terminar.
Un hilo puede terminar de tres maneras sin terminar el proceso:
Retornando de su rutina de inicio, cancelado por otro hilo del
mismo proceso, o llamando pthread_exit.
(THREADS)
Trmino de un Hilo
76
(THREADS)
Detaching y Joining en hilos (desasociar y reunin)
Todo hilo ocupa recursos del SO para su operacin. Entre ellos se
encuentra el estatus de trmino el cual es retenido hasta el llamado
a pthread_join; sin embargo, los recursos ocupados por un hilo
pueden ser retornados inmediatamente despus que ste termina si
llamamos a pthread_detach. En este caso un llamado a
pthread_join fallar .
77