Buenas a todos, durante estos días estuve leyendo un libro muy
interesante de C "Linux System Programming" y encontré algo para
compartir. La función select conocida y odiada por muchos realmente
hoy en día ya no se usa, básicamente por 3 motivos principales; muy
baja performance con gran numero de descriptores, si o si maneja una
lista estática de descriptores y sus dilemas de implementacion. Lo que
tiene select es que es una función milenaria y fue la primera que se
implemento, al punto de que incluso era usada en vez de usar sleep o
usleep ( simplemente ponían todas las lista de descriptores vacías y
le ponían un timeout ).
Los 2 problemas implementativos que tiene es que cada vez que se
llama a la función select se tienen que crear los set de descriptores
( con FD_SET ) ya que una vez que se uso el set este tiene que ser
creado nuevamente. El segundo problema, y menos conocido, es que el
select tampoco garantiza que la referencia a la variable de nuestro
timeout vuelva sin ser modificada ( porque diablos seria modificada???
O.o ). Tal y como dice la especificación de Posix (
http://pubs.opengroup.org/onlinepubs/9699919799/functions/select.html#
):
- Upon successful completion, the select() function may modify the
object pointed to by the timeout argument.
A aquellos que quieran aventurarse en cosas interesante Posix define
otra función que cumple la misma funcionalidad que select pero con una
implementacion mas linda, la cual es poll(). Pero los que quieran
hacer cosas en serio, existe la función epoll propia de Linux que
tiene una performance muy superior a select, su implementacion es muy
simple y soporta una cantidad dinámica de descriptores. Espero poder
subir algunos ejemplos comparativos durante esta semana.
Saludos!