Hola,
Llevo leyendo durante mucho tiempo estos foros, y hasta la fecha no me he <<dignado>> a escribir.
En este mismo momento tengo un problemilla con estos asuntos, por lo que me he lanzado y a ver que pasa.
Os cuento:
El programa sencillamente debe realizar los siguientes pasos:
- Conectarse a una base de datos Postgres y obtener una lista con las direcciones IP y ficheros (.tar) a enviar via FTP.
- Crear un thread con esta información, buzonear el fichero en la ip indicada.
- Lanzar dos comandos via rsh (uno para descomprimir el .tar y otro para ejecutar el .sh adjunto en el fichero).
- Recibir el resultado de la operación y actualizar las tablas.
La cuestión es que un vez finalizado el proceso de buzoneo del fichero, y, si deseo llamar al primer comando de descompresión, el resto de los threads mueren, quedando ese thread con el nuevo proceso (en este caso el tar).
Creo que es una cuestión de linux, dado que es imposible crear una llamada tipo exec() dentro de un hilo.
La pregunta es:
Existe alguna forma de realizar esta operación (en multithread) o es necesario crear un proceso en vez de un thread?
Lenguaje de programación: c++ bajo RH9 y Ubuntu 6.06
Un saludo.
http://www.codeproject.com/threads/work_queue.asp
Se recomiendan encarecidamente los posix threads :)
ains
Podrias probar a hacer un fork antes del exec. Copio aqui una parte de las paginas man relativa a esto:
POSIX Threads
In applications that use the POSIX threads API rather than
the Solaris threads API ( applications linked with
-lpthread, whether or not linked with -lthread), a call to
fork() is like a call to fork1(), which replicates only the
calling thread. There is no call that forks a child with all
threads and LWPs duplicated in the child.
Note that if a program is linked with both libraries (-
lthread and -lpthread), the POSIX semantic of fork() pre-
vails.
fork() Safety
If a Solaris threads application calls fork1() or a POSIX
threads application calls fork(), and the child does more
than simply call exec(), there is a possibility of deadlock
occurring in the child. The application should use
pthread_atfork(3C) to ensure safety with respect to this
deadlock. Should there be any outstanding mutexes throughout
the process, the application should call pthread_atfork() to
wait for and acquire those mutexes prior to calling fork()
or fork1(). See "MT-Level of Libraries" on the attributes(5)
manual page.
Hola,
Al final no es posible utilizar threads. Parece ser que un hilo no puede contener un proceso en si( una llamada al sistema como por ejemplo rsh), ya que se cargaría todo el espacio de memoria compartido con el resto de threads.
Por lo tanto, solo queda la solución multiproceso. Alguien tiene algun tutorial o ejemplo para codificar un pool de procesos (10 max por ejemplo) y poder manejar todos las posibles ocurrencias con solo esos? En plan esperar a que finalice (no importa el estado) una vez finalizado (libre) y en caso de que haya mas datos a tratar reasignarlos etc.
Un saludo