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/





Responder a