2008-08-07 8 views
12

Tengo un proceso en erlang que se supone que debe hacer algo inmediatamente después del spawn, luego envío el resultado al padre cuando finaliza. ¿Cómo averiguo el PID del proceso que lo engendró?Cómo se determina el PID del elemento primario de un proceso

+0

Para OTP y otros procesos que usan 'proc_lib', vea [¿Cómo encontrar al supervisor de un proceso OTP?] (Http://stackoverflow.com/questions/4132317/how-to-find-the-supervisor-of -an-otp-process) –

Respuesta

14

Debe pasar self() al hijo como uno de los argumentos de la función de entrada.

spawn_link(?MODULE, child, [self()]). 
0

Puede utilizar el BIF regístrese para dar el proceso de desove/padre un nombre (un átomo) a continuación, se refieren de nuevo al nombre registrado de otros procesos.

FUNC() ->

%% Haga algo
%% A continuación, enviar el mensaje a los padres
padres! MENSAJE.

...

registro (padre, sí()),
desove (MÓDULO, FUNC, [ARGS]).

Ver Getting Started With Erlang §3.3 y The Erlang Reference Manual §10.3.

+0

Si bien puede hacerlo registrando un nombre, no es en absoluto una buena idea. Esta publicación sería mejor si se desanima activamente por hacerlo y explica los problemas. – Christian

+1

De vuelta en la versión beta privada (esta pregunta se remonta a aproximadamente una semana después del inicio de la versión beta privada), el aspecto de discusión del sitio no estaba muy bien formado. Realmente no quería expresar una opinión, simplemente establecer un enfoque alternativo. Creo que los pros y los contras se han abordado adecuadamente en las otras respuestas/publicaciones. –

4

La respuesta de @Eridius es la forma preferida de hacerlo. Solicitar un proceso para registrar un nombre puede tener efectos colaterales involuntarios, como aumentar la visibilidad del proceso, sin mencionar la molestia de encontrar nombres únicos cuando tienes muchos procesos.

3

La mejor manera es definitivamente pasarlo como argumento a la función llamada para iniciar el proceso hijo. Si está de desove diversiones, que generalmente es una buena cosa que hacer, tener cuidado de hacer:

spawn_link(fun() -> child(self()) end) 

la que no vamos a hacer como se pretendía. (Sugerencia: cuando se llama a self())

En general, debe evitar registrar un proceso, es decir, darle un nombre global, a menos que realmente desee que se conozca globalmente. Engendrar una diversión significa que no tiene que exportar la función engendrada, ya que generalmente debe evitar la exportación de funciones que no están destinadas a ser llamadas desde otros módulos.

Cuestiones relacionadas