进程链接:
通过调用process_flag(trap_exit,true)来把一个普通进程转为系统进程,系统进程能捕获它所链接的进程的退出消息。
进程A与进程B链接,进程B调用process_flag(trap_exit,true),进程B为系统进程,进程A正常常退出时,进程B捕获到并处理A退出的消息,进程B继续正常运行。
进程A与进程B链接,进程B调用process_flag(trap_exit,true),进程B为系统进程,进程A异常退出时,进程B捕获到并处理A退出的消息,进程B继续正常运行。
进程A与进程B链接,进程B调用process_flag(trap_exit,false),进程B不是系统进程,进程A正常退出时,进程B不会捕获到A的退出消息,进程B继续正常运行。
进程A与进程B链接,进程B调用process_flag(trap_exit,false),进程B不是系统进程,进程A异常退出时,进程B不会捕获到A的退出消息,进程B也退出了。
ets:
如果已经定义了一个记录:-record(player,{id,name,age}).
如果再定义一个ets用于保存玩家信息:ets:new(player,[set,protected,named_table,{keypos,#player.id}]).
编译文件的时候没问题,程序运行的时候在新建ets表player的时候会报错(** exception exit: badarg in function ets:new/2)。
解决方法:表名和记录名冲突了,随便改一个。
pid:
{ok,Pid} = gen_server:start_link(Name,Module,[],[]).调用此句的时候,会把Pid注册到名字Name,所以不能再次注册register(otherName,Pid).
whereis(name)的参数是进程注册的名字,返回的是Pid。
is_pid(P).返回的是true/false.
给pid发送消息不会有任何错误,哪怕该进程不存在;但是,当注册的进程不存在时,通过注册名给它发消息会出错。 ->