FD_SET en Linux (pregunta de nivel medio-alto)

Iniciado por Stroncio, 9 Enero 2011, 03:05 AM

0 Miembros y 1 Visitante están viendo este tema.

Stroncio

tengo la siguiente duda ante la estructura fd_set al aplicarle la macro FD_SET sobre como se realiza el llenado:

en un principio crei que seria asi:

fd_set apunta a un array asi: 0000 0000 0000 0000 0000 0000 (BIT)
ahora hago FD_SET con 0
creia que seria:                     1000 0000 0000 0000 0000 0000
pero parece ser que es asi:    0000 0001 0000 0000 0000 0000
ahora la duda es cuando se llene el primer byte, me imagino que se llenara
el segundo asi:                      1111 1111 0000 0001

busco una implementacion de las macros FD_SET,FD_ISSET,FD_CLR en NASM pero no encuentro nada.

nosoqui

Saludos Stroncio !
según he comprobado.... fd_set es una variable de 1024 bits en el que se describe un conjunto de descriptores(ficheros, sockets .... lo que sea), por tanto si tenemos un descriptor de valor(entero) x y queremos introducirlo en ese conjunto, lo que tenemos que hacer es poner el bit número x a 1, eso lo haríamos haciendo una operación OR(|) del conjunto con el 1 desplazado hacia la izquierda(<<) x ... pero para hacer eso tienes que tener en cuenta si la memoria se gestiona con Little endian o Big endian, en el primer caso, en el conjunto de 128 bytes, se almacenan los bytes menos significativos en las posiciones de memoria más bajas(y al contrario en Big Endian), por tanto(y suponiendo que estamos en little endian ya que la mayoria de nuestros sistemas lo hacen así) si tenemos un descriptor cuyo valor es por ejemplo 242, tendremos que irnos al byte número 242/8 y hacer el desplazamiento hacia la izquierda 242%8 (módulo, es decir el resto) ....
En el caso de querer saber si un descriptor está activo.... lo que haríamos es lo mismo pero haciendo un AND y ver si el resultado es distinto de 0 (lo cual indicaria que sí está activo)

Mucha suerte y espero que sirva de algo

Stroncio

tenia dudas sobre si se consideraba la cadena de 1024 o de byte en byte
te paso el codigo y comprobamos si lo hago bien?
gracias

nosoqui

Según he comprobado(viendo las posiciones de memoria individualmente), he deducido que se almacena como he dicho... no domino mucho el ensamblador! pero si me pasas el codigo(por aquí o por privado), haré el máximo esfuerzo por entenderlo ....
Un par de detalles:
1º En mi ordenador, la variable fd_set ocupa 128 bytes pero es posible que en otro sistema linux ocupe otro espacio
2º No se como estará implementada la macro en las librerias originales pero la que te pongo a continuación tiene los mismos efectos(por si te sirve de algo) :
#define FD_SET(A,B) *((unsigned char *) A + (B / 8))|=(1<<(B % 8))

Un saludo!

Stroncio

#4
gracias por tu ayuda, no te molesto mas, creo que lo hice bien.
saludos