PDA

Ver la versión completa : Si un proceso llama a una funcion que le mata a el mismo



Aiken
16/10/2009, 00:57
Pues eso.

Un proceso llama a una funcion:
La funcion:
- hace algunas cosas.
- mata al proceso que la llamo (S_KILL_TREE), si se cumple una condicion.
- hace algunas cosas (2).


Pregunta:
las cosas que hay EN LA FUNCION despues de matar al proceso que la llamo se terminara de ejecutar la funcion? el proceso entiendo que no, que muere justo en esa linea no?

Aiken

SpaVampyre
16/10/2009, 01:21
No se como funciona exactamente Fenix, pero lo lógico sería que no siguiese ejecutando nada despues del Kill.

Aiken
16/10/2009, 02:41
No se como funciona exactamente Fenix, pero lo lógico sería que no siguiese ejecutando nada despues del Kill.

ya, pero la propia funcion que ha llamado al kill no esta "despues" del kill, esta en el mismo sitio que el kill.

yo creo que teniendo en cuenta que fenix no es multiproceso real, seguira ejecutando al menos esa funcion, pero a ver si algun guru nos lo confirma.

ah! estoy preguntando para 092a por si es diferent en bennu.
Aiken

Hokutoy
16/10/2009, 08:30
Creo recordar que cuando se usa un s_kill el proceso o procesos quedan "marcados" para matar al inicio del siguiente frame. Por lo que los procesos marcados para morir haran todo lo que tengan que hacer hasta que se encuentren un frame, esperaran ahí quietos, y moriran al inicio del siguiente frame.
Por lo que parece la funcion hara todo lo que haya entre la orden s_kill y antes del comando frame.
Algo así como:
La funcion:
- hace algunas cosas.
- mata al proceso que la llamo (S_KILL_TREE), si se cumple una condicion. --> la funcion queda marcada para morir en el siguiente frame
- hace algunas cosas (2).--> estas cosas si las hace
- frame --> la funcion muere
- mas cosas --> estas no las hace

Saludos

PD: Si no es así que algun GURU me corrija que a mí tambien me interesa.

hardyx
16/10/2009, 09:11
Si un proceso llama a una función o crea otro proceso que chequea algo y mata al proceso llamante, no es inmediato, porque depende de la gestión de procesos de Fénix. Lo de matar es una "señal" que se manda para matar al proceso, es como un mensaje que se encola para ser procesado. Se usa mucho en programación concurrente.
La solución sería por ejemplo que la función devuelva falso si el proceso no debe ejecutar las instrucciones que quedan, o usar una variable privada "activo" del propio proceso.

animanegra
16/10/2009, 12:18
¿y para matar a tu propio proceso porque no haces un exit? Con eso consigues que no siga ejecutando nada.

Aiken
16/10/2009, 15:38
¿y para matar a tu propio proceso porque no haces un exit? Con eso consigues que no siga ejecutando nada.

yo no he dicho que no quiera que siga, he preguntado que pasa en ese caso. y concretamente lo que quiero es que si que siga.

y en realidad es que es mas complicado, porque el proceso no se mata a si mismo, la funcion que lo mata, mata al padre de mi proceso ordenando que muera la descendencia, es decir que ... no se esta matando asi mismo directamente, asi que no puedo hacer un exit.

Aiken

Drumpi
16/10/2009, 18:40
Primero me gustaría que aclarases si el primer proceso llama a otro proceso o a una función, porque son cosas distintas.
Si es una función no sé cómo se comportaría, pero si es un proceso sí.

Si estás usando Fenix en una versión antigua (no recuerdo en cual se hizo el cambio, pero en la 083b funcionaba así), cuando invocas un signal este espera al siguiente frame para ejecutarse.
En las modernas no, tal como las llamas eliminan a los procesos, y en el caso de s_kill_tree a todos sus hijos AUNQUE ESTE MISMO SEA EL QUE LO LLAMA, en este caso:
-hace cosas.
-hace el s_kill_tree.
-muere.

En Bennu hay una alternativa, y es que puedes especivicar una seccion llamada ON EXIT (es como la seccion private o begin) en la que puedes escribir todas las acciones que quieres que haga antes de desaparecer definitivamente. Se ejecuta al acabar su propio código o al recibir una señal de muerte.

Por cierto: tened mucho cuidado al usar s_kill_tree, pues mata a un proceso y todos sus hijos, y si no tienes controlado el arbol de dependencias... O peor, si el proceso no existe se puede matar al main y todos sus hijos y los procesos huérfanos, o tener un comportamiento muy extraño. Recuerdo que existe s_kill para matar a un único proceso.

SpaVampyre
16/10/2009, 19:16
En el fondo, y sin tener yo idea de fenix, para que quieres hacer eso?

swapd0
16/10/2009, 21:46
Es mejor y mas facil de seguir si pones una variable interna a true y al final si esta a true te matas o sales del proceso (no programo en fenix)

No es muy elegante el suicidarte. En caso del fenix como es interpretado quien sabe si en una nueva version vas a tener problemas con el interprete....

Aiken
16/10/2009, 22:05
Primero me gustaría que aclarases si el primer proceso llama a otro proceso o a una función, porque son cosas distintas.
Si es una función no sé cómo se comportaría, pero si es un proceso sí.



uno es proceso ventana()
y otro es el proceso boton_cerrarventana(), hijo de ventana().

y la funcion se llama cerrarventana() y lo que hace es hacer un s_kill_tree del proceso ventana por lo que muere la ventana con todo lo que hay dentro, incluido el propio boton_cerrarventana que fue al que llamo a la funcion.

a que ahora si se entiende :D

Aiken

< - >

En Bennu hay una alternativa, y es que puedes especivicar una seccion llamada ON EXIT

en bennu? lo tengo puesto en fenix, creo que concretamente en ese boton, para que cuando muera haga un delete del texto del boton y funciona bien en fenix 092.

Aiken

< - >

Por cierto: tened mucho cuidado al usar s_kill_tree, pues mata a un proceso y todos sus hijos, y si no tienes controlado el arbol de dependencias... O peor, si el proceso no existe se puede matar al main y todos sus hijos y los procesos huérfanos, o tener un comportamiento muy extraño. Recuerdo que existe s_kill para matar a un único proceso.

yaya, pero como comprenderas para matar a una ventana, y que mate a los botones y objetos que tiene dentro la ventana lo mas comodo es un s_kill_tree :)

Aiken

Drumpi
17/10/2009, 01:44
uno es proceso ventana()
y otro es el proceso boton_cerrarventana(), hijo de ventana().

y la funcion se llama cerrarventana() y lo que hace es hacer un s_kill_tree del proceso ventana por lo que muere la ventana con todo lo que hay dentro, incluido el propio boton_cerrarventana que fue al que llamo a la funcion.

a que ahora si se entiende :D

Si, se entiende, así que es lo que te he dicho: signal funciona inmediatamente, sin ejecutar más código.


en bennu? lo tengo puesto en fenix, creo que concretamente en ese boton, para que cuando muera haga un delete del texto del boton y funciona bien en fenix 092.

Es posible que estuviese en esa versión de Fenix, es una en las que Splinter metió mano y hubo tantos cambios que me cuesta saber de memoria en qué version se añadió/cambió/quitó tal cosa (toda la info que doy es de memoria, no suelo consultar salvo que tenga el archivo de ayuda de Fenix083b a mano).
Si, puede que exista en Fenix, ahora que lo mencionas, y creo que fue uno de esos cambios "radicales" que les sentó mal a más de uno (en su día, debo confesar, que a mi también)... pero mira por donde, a los novatos les viene de lujo y es una gran ayuda.


yaya, pero como comprenderas para matar a una ventana, y que mate a los botones y objetos que tiene dentro la ventana lo mas comodo es un s_kill_tree :)

En ese caso te recomiendo que no sea el hijo el que mate al padre y a los demás, eso debería ser trabajo del padre, por lo que le tienes que mandar una señal de alguna forma.
Yo aun le estoy dando vueltas porque quiero rehacer mi tilemap editor, y de momento, el mejor método que he conocido (basándome en otros lenguajes que he ido viendo), es que cada ventana sea controlada por un proceso padre (con el gráfico del fondo de la ventana, si quieres), con una serie de variables privadas que son modificadas por sus hijos mediante punteros (valores numéricos, variables booleanas...) y una variable LOCAL que podríamos denominar "señal_entrada", que vale 0 salvo que uno de sus hijos quiera indicarle al padre que realice una acción, por ejemplo:
-1: crear un proceso determinado.
-2: matar hijos, descargar recursos y cerrar ventanas.
-3: llamar a sub-ventana y pasar el arbol a "freeze".
Obviamente, una vez acabe de realizar la acción, debería pasar a cero antes de volver a su ejecución normal.

Si habeis trabajado con algun lenguaje visual de windows para hacer ventanas y demás, lo comprenderéis. Yo lo hice en un laboratorio, de instrumentación, creo que era con LabView o similar...