Problemas con puertos en linux
Aldrin Martoq
amartoq en dcc.uchile.cl
Mie Jun 30 00:49:58 CLT 2010
On Jun 29, 2010, at 2:42 PM, Alvaro Gili wrote:
> Que tal Aldrin, estuve buscando bastante con los datos que me pasó Alvaro, y
> si me interesé en buscarlo y no fuí el único que lo hizo en mi empreza ya
> que debemos solucionarlo.
Hola, hmm... ok.
[...]
> Pero al usar aquí la función system que
> uno por defecto simpre usa (cabe aclarar que probé con QProcess y todos los
> deribados de exec me surge este problema) me surgió eso.
[Tuve que releer el thread completo para entender cuál es tu problema, en parte por la mala redacción, la mala costumbre de no "formatear" las respuestas anteriores como lo hago ahora ni mucho menos dejar sólo las partes interesantes de la conversación. Con la descripción que das aquí no se entiende nada, eso dificulta a cualquiera que pretenda ayudarte. Tampoco has explicado cuales son los problemas que has tenido, un "no funciona" o "me fue mal" no es explicación válida aquí]
Tu problema no es algo anómalo, es natural en UNIX que un proceso hijo herede los descriptores abiertos del padre. Cuando necesitas lo contrario (un programa independiente, que no tenga nada que ver con el hijo) es lo que se llama un demonio. Para escribir un demonio, se espera que el programa hijo realice las operaciones para desasociarse del padre.
http://en.wikipedia.org/wiki/Daemon_(computer_software)
http://en.wikipedia.org/wiki/Daemon_(computer_software)#Types_of_daemons
Al final de la wikipedia, hay enlaces útiles para los programadores. Léelos:
http://www.enderunix.org/docs/eng/daemon.php
http://www-theorie.physik.unizh.ch/~dpotter/howto/daemonize
La mayoría de los programas demonios se convierten en demonio SOLO cuando se invocan con algún parámetro (ej: -bd en sendmail, mira el man). Es decir, debes chequear los argumentos de tu programa demonio que en tu caso es el programa FTM. Ahora, si el programa lo escribiste tu, debes verificar que sigue la receta y usualmente el ejecutable termina en d (ejemplo fmtd). HINT: existe una función daemon(3).
Si miras la receta verás que lo normal es redirigir a /dev/null SOLO los descriptores 0, 1 y 2. Entonces esto no resuelve tu problema del socket de "web service", lo que debes hacer es corregir tu programa escrito con QT. Una forma bastante óptima es aplicar la solución que propuso Álvaro Herrera (marcar al descriptor que deba cerrarse en un fork, EXPLICA BIEN cual es el problema que tienes). Otra opción mas idiota es cerrar todos los fd's antes de ejecutar el programa. Esto es lo que he visto sucede al iniciar algunos demonios, por ejemplo mira la salida del siguiente comando:
root# /etc/init.d/httpd stop
root# strace -fe execve,close,bind -o /tmp/strace.log /etc/init.d/httpd start
Reemplaza httpd por tu demonio favorito, al menos en mi sistema en /tmp/strace.log se cierran todos los descriptores antes de iniciar el demonio. Puedes encontrar en internet cómo hacer el loop de cerrar todos los descriptores correctamente.
Aldrin Martoq
http://aldrin.martoq.cl/
Más información sobre la lista de distribución Linux