proc lib spawn相關原始碼分析

2021-08-02 09:31:19 字數 2931 閱讀 5183

proc_lib中所有關於程序相關的方法都是在bif裡的spawn相關方法上封裝實現的。主要做程序字典'$ancestors' '$initial_call'的初始化和crash報告、退出處理。

一、proc_lib:spawn*相關函式實現

1、proc_lib:spawn* 相關函式通過呼叫相應的erlang:spawn*方法,執行proc_lib:init_p方法實現。

2、proc_lib_init_p進行'$ancestors' '$initial_call'程序字典初始化,並執行程序要執行的方法,如果執行異常,則執行proc_lib:exit_p處理異常,做crash報告,並執行exit退出。

-spec

init_p(pid(), [pid()], function())

->

term().

init_p(

parent ,

ancestors ,

fun )

when

is_function(

fun )

->

put('$ancestors', [

parent

| ancestors

]),= erlang:fun_info(

fun, module),

= erlang:fun_info(

fun, name),

= erlang:fun_info(

fun, arity),

put('$initial_call', ),

try

fun()

catch

class

: reason

->

exit_p(

class ,

reason )

end.-

spec

init_p(pid(), [pid()], atom(), atom(), [term()])

->

term().

init_p(

parent ,

ancestors ,

m , f

, a )

when

is_atom(

m ), is_atom(

f ), is_list(

a )->

put('$ancestors', [

parent

| ancestors

]),put('$initial_call', trans_init(

m , f

, a )),

m , f

, a ).

m , f

, a )

->

trym

, f , a

) catch

class

: reason

->

exit_p(

class ,

reason )

end.

exit_p(

class

, reason

) ->

case

get('$initial_call')

of

when

is_atom(

m ), is_atom(

f ), is_integer(

a )

->

mfa= ,

crash_report(

class

, reason

, mfa

),exit(

reason);_

->

%% the process dictionary has been cleared or

%% possibly modified.

crash_report(

class

, reason

, ),

exit(

reason

) end.

二、proc_lib:start*相關函式實現

1、proc_lib:start*相關函式通過呼叫proc_lib:spawn*相關方法實現程序建立,然後呼叫proc_lib:sync_wait等待ack訊息,實現同步。

sync_wait(

pid ,

timeout )

->

receive

->

return ;

->

after

timeout

->

unlink(

pid),exit(

pid, kill),

flush(

pid),

end.-

spec

flush(pid())

->

'true'.

flush(

pid )

->

receive

->

true

after0

->

true

end

.

yum源的相關配置

進入相應的路徑 vi etc yum.repos.d rhel source.repo base name mybase baseurl file iso 該路徑下,必須能找打 repodata 目錄。enabled 1 gpgcheck 0 yum repolist yum list 掛載映象 v...

映象源的相關知識

npm install g nrm npm install nrm g 按章選擇原的工具包 nrm ls 檢視所有源,在這裡有npm 國外版本 taobao等等 nrm test 測試所有源 nrm use 切換要更改的源名 切換源 當nrm ls後 切換 切換到taobao nrm use tao...

yum源的相關事項

有時候需要某些個別的包,不想使用yum的關聯更新的時候,找到rpm包是個問題,但是163可以提供 1.先看看centos版本 cat etc redhat release 2.找到對應的路徑如 6.5 os x86 64 packages ftp 0.17 54.el6.x86 64.rpm 3.使...