Article View: es.comp.os.linux.programacion
Article #17857Re: Sockets asincronos en Linux
From: oscar
Date: Wed, 20 Oct 1999 00:00
Date: Wed, 20 Oct 1999 00:00
54 lines
4032 bytes
4032 bytes
Juan Carrasco <jcarras@glup.uv.es> wrote: > Lo ideal ser�a que cada socket se enterara de cuando dispone de datos, y > en un programa puedo tener varios sockets funcionando, por lo que con SIGIO > me har�a falta un mecanismo extra para saber que sockets existen y detectar > el que tiene datos, adem�s de que no se que capacidades tengo para llamar > funciones desde un manejador de se�al. Eso es facil. Mira la funci�n select. Pro una parte usas SIGIO para que te informen (eso no lo he usado... en el peor caso, el SIGIO te lo puede enviar una hebra). Al producirse un SIGIO, ya sabes que al menos un descriptor, tiene datos para leer. Pues bien. select te permite saber, cual, de un conjunto de descriptores, tiene datos pendientes de leer. De esa manera, y con un poco de habil programaci�n, es posible crear tus ansiadas clases. Veamos. Supongamos que en Linux ni siquiera existe un modo en el cual, al haber datos pendientes te mande un SIGIO. Creas una hebra, dedicada exclusivamente a proporcionar eventos as�ncronos para poder detectar los eventos aparte del programa principal (TODOS los eventos, incluidos movimientos de raton, pulsaciones, lectura de sockets, etc.) Bien... La lectura de dichos eventos, salvo casos excepcionales, se realiza leyendo de un conjunto de descriptores. Cuando ocurre un evento, este manda los datos al fichero referenciado por un descriptor. Por lo general en Unix, los ficheros "especiales" de este tipo (sockets, terminales, dispositivos de caracteres) suelen ser bloqueantes. Es decir, cuando se intenta leer de ellos y no hay datos que proporcionar (se leen eventos del raton pero este no se mueve) el proceso se queda parado y no lee. Ahora bien... haciendo uso de la funci�n select, se puede estar esperando por la lectura de varios descriptores a la vez, y en el momento de que en alguno haya datos, este se desbloquear�. Tambi�n se pueden revisar de manera no bloqueante, consultando si hay datos disponibles o no. Sin embargo si dedicamos una hebra solo al asunto no hay raz�n para hacerlo as�. Nos vale con bloquear y en el momento que hay algo que leer de alguno de los descriptores de desbloquear� y podr�s leer de el. Ahora, tan solo debes hacer tus clases de la siguiente manera... Al arrancar se crea una hebra especial para eventos as�ncronos. Cuando dicha hebra detecta que un descriptor tiene datos para leer, leer� los datos, los introducir� en el buffer correspondiente y ver� en alg�n tipo de estructura, la funci�n que debe mandar al hilo principal que debe ejecutar ante la lectura de dicho perif�rico. Manda una se�al al hilo principal que consultar� dichos datos y ejecutar� la funci�n adecuada de tratamiento. Las se�ales se parecen a las interrupciones del DOS. Tras ejecutarse, recuperan la posici�n anterior de ejecuci�n. Hay que tener cuidado. Si empleamos se�ales el hilo principal JAMAS debe usar lecturas bloqueantes, ya que las se�ales las rompe y estas pueden no funcionar. La sincronizaci�n entre hilos bien se puede hacer mediante sem�foros IPC o usando alg�n tipo de variable que haga las veces de sem�foro (son hilos y comparten variables globales) Espero haberte dado ideas. Suerte.
Technical Details
Message-ID:
<7ukbrf$k9e$1@titan.bt.es>Path:
arc1-ca.pugleaf.net!unknown!not-for-mailReferences:
<7uk83t$8v7$1@peque.uv.es>Show Full Headers
Complete Article Headers
X-Google-Language: SPANISH,ASCII X-Google-Thread: f86c8,d174b8549cf7b4e8 X-Google-Attributes: gidf86c8,public From: oscar@server.enmicasa.dhs.org Subject: Re: Sockets asincronos en Linux Date: 1999/10/20 Message-ID: <7ukbrf$k9e$1@titan.bt.es> X-Deja-AN: 538390049 Distribution: es Content-Transfer-Encoding: 8bit References: <7uk83t$8v7$1@peque.uv.es> Content-Type: text/plain; charset=ISO-8859-1 X-Complaints-To: abuse@bt.es X-Trace: titan.bt.es 940421807 20782 212.22.49.143 (20 Oct 1999 12:16:47 GMT) Organization: BT Tel. Netnews service (readers) Mime-Version: 1.0 User-Agent: tin/pre-1.4-980226 (UNIX) (Linux/2.2.12 (i686)) NNTP-Posting-Date: 20 Oct 1999 12:16:47 GMT Newsgroups: es.comp.os.linux.programacion