2008-08-07 5 views
12

나는 스폰 이후에 바로 작업을 수행해야하는 erlang의 프로세스를 가지고 있습니다. 프로세스가 끝나면 부모에게 결과를 다시 보냅니다. 어떻게 그것을 생성 한 프로세스의 PID를 알아낼 수 있습니까?프로세스의 부모 PID를 어떻게 결정합니까

+0

OTP 및 'proc_lib'을 사용하는 다른 프로세스에 대해서는 [OTP 프로세스 관리자를 찾는 방법] (http://stackoverflow.com/questions/4132317/how-to-find-the-supervisor-of)을 참조하십시오. -an-otp-process) –

답변

14

entry 함수의 인수 중 하나로 child()를 전달해야합니다.

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

당신은 BIF는 산란/부모 프로세스에게 다음 다른 프로세스로부터 다시 등록 이름을 참조 이름 (원자)을 수득 등록 할 수 있습니다.

FUNC() ->

그런 다음 부모에게
부모 메시지를 보낼 %% 뭔가
를 수행 %%! 메시지.

...

레지스터 (모 자체())
스폰 (MODULE, FUNC [ARGS).

Getting Started With Erlang §3.3The Erlang Reference Manual §10.3을 참조하십시오.

+0

이름을 등록하여 할 수는 있지만 전혀 좋은 생각은 아닙니다. 이 게시물은 당신이 적극적으로 그것을하기를 낙담하고 문제를 설명한다면 더 좋을 것입니다. – Christian

+1

개인 베타 (개인 베타가 시작된이 문제는 약 1 주일 전으로 거슬러 올라갑니다) 사이트의 토론 측면은 굉장히 잘 형성되지 않았습니다. 나는 정말로 의견을 표명하고 싶지 않고 단지 대체 접근법을 진술합니다. 나는 찬반 양론이 다른 답변/게시물에서 적절히 다루어 졌다고 생각한다. –

4

@Eridius의 답변은 선호하는 방법입니다. 이름을 등록하도록 프로세스를 요구하면 많은 프로세스가있을 때 고유 한 이름을 사용하는 번거 로움을 언급하지 않고 프로세스의 가시성을 높이는 것과 같은 의도하지 않은 부작용이있을 수 있습니다.

3

가장 좋은 방법은 확실히 하위 프로세스를 시작하기 위해 호출 된 함수의 인수로 전달하는 것입니다. 당신이 일반적으로 할 수있는 좋은 일이 funs입니다을 산란하는 경우, 일을주의 : 당신이 의도 한대로 수행되지 않습니다

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

. (힌트 : self()가 호출되는 경우)

일반적으로 전역 적으로 알기를 원하지 않는 한 일반적으로 프로세스를 등록해야합니다. 즉, 전역 이름을 지정하지 않아야합니다. 재미를 유발한다는 것은 일반적으로 다른 모듈에서 호출 할 수없는 함수를 내보내지 않아야하므로 생성 된 함수를 내보낼 필요가 없다는 것을 의미합니다.