erlang进程总结

 

代码一:
-module(exit_demo).  
-export([start_a/0,start_b/1,af1/1]).  
  
start_a()->  
    spawn(fun af/0).  
      
af()->  
    io:format("process a created."), 
	%%process_flag(trap_exit,true),
    receive  
		
		{'EXIT',_Pid,abc} ->  
           io:format("kill"),
		   af();
		   
		%%{'EXIT',_Pid,normal} ->  
        %%  io:format("normal"); 
		   
		{'EXIT',_Pid,kill} ->  
           io:format("kill"),
		   af()
		   
     
       
     
    end.  
  
start_b(Pid)->  
    spawn(exit_demo,af1,[Pid]).  
  
af1(Pid)->  
    link(Pid),
	exit(normal),
	receive
		X -> X
	end.

 代码二:

 

-module(exit_demo).  
-export([start_a/0,start_b/1,af1/1]).  
  
start_a()->  
    spawn(fun af/0).  
      
af()->  
    io:format("process a created."), 
	%%process_flag(trap_exit,true),
    receive  
		
		{'EXIT',_Pid,abc} ->  
           io:format("kill"),
		   af();
		   
		%%{'EXIT',_Pid,normal} ->  
        %%  io:format("normal"); 
		   
		{'EXIT',_Pid,kill} ->  
           io:format("kill"),
		   af()
		   
     
       
     
    end.  
  
start_b(Pid)->  
    spawn(exit_demo,af1,[Pid]).  
  
af1(Pid)->  
    link(Pid),
	exit(Pid,normal),
	receive
		X -> X
	end.

 代码三:

 

-module(exit_demo).  
-export([start_a/0,start_b/1,af1/1]).  
  
start_a()->  
    spawn(fun af/0).  
      
af()->  
    io:format("process a created."), 
    process_flag(trap_exit,true),
    receive  
		
		{'EXIT',_Pid,abc} ->  
           io:format("kill"),
		   af();
		   
		%%{'EXIT',_Pid,normal} ->  
        %%  io:format("normal"); 
		   
		{'EXIT',_Pid,kill} ->  
           io:format("kill"),
		   af()
		   
     
       
     
    end.  
  
start_b(Pid)->  
    spawn(exit_demo,af1,[Pid]).  
  
af1(Pid)->     link(Pid),exit(Pid,normal),receive X -> X end.

 代码四:

 

-export([start_a/0,start_b/1,af1/1]).  
  
start_a()->  
    spawn(fun af/0).  
      
af()->  
    io:format("process a created."), 
	process_flag(trap_exit,true),
    receive  
		
		{'EXIT',_Pid,abc} ->  
           io:format("kill"),
		   af();
		   
	         {'EXIT',_Pid,normal} ->  
           io:format("normal"); 
		   
		{'EXIT',_Pid,kill} ->  
           io:format("kill"),
		   af()
		   
     
       
     
    end.  
  
start_b(Pid)->  
    spawn(exit_demo,af1,[Pid]).  
  
af1(Pid)->  
    link(Pid),
	exit(Pid,normal),
	receive
		X -> X
	end.
 
 

代码五:

 

-export([start_a/0,start_b/1,af1/1]).  
  
start_a()->  
    spawn(fun af/0).  
      
af()->  
    io:format("process a created."), 
	process_flag(trap_exit,true),
    receive  
		
		{'EXIT',_Pid,abc} ->  
           io:format("kill"),
		   af();
		   
	         {'EXIT',_Pid,normal} ->  
           io:format("normal"); 
		   
		{'EXIT',_Pid,kill} ->  
           io:format("kill"),
		   af()
		   
     
       
     
    end.  
  
start_b(Pid)->  
    spawn(exit_demo,af1,[Pid]).  
  
af1(Pid)->  
    link(Pid),
	exit(Pid,kill),
	receive
		X -> X
	end.
 

 代码六

 

-export([start_a/0,start_b/1,af1/1]).  
  
start_a()->  
    spawn(fun af/0).  
      
af()->  
    io:format("process a created."), 
	process_flag(trap_exit,true),
    receive  
		
		{'EXIT',_Pid,abc} ->  
           io:format("kill"),
		   af();
		   
	         {'EXIT',_Pid,normal} ->  
           io:format("normal");,
		   
		%%{'EXIT',_Pid,kill} ->  
           %%io:format("kill"),
		%%   af()
		   
     
       
     
    end.  
  
start_b(Pid)->  
    spawn(exit_demo,af1,[Pid]).  
  
af1(Pid)->  
    link(Pid),
	exit(Pid,kill),
	receive
		X -> X
	end.
 分布执行 
      Pid = exit_demo:start_a().
      Pid1 = exit_demo:start_a(Pid).
      erlang:is_process_alive(Pid).
      erlang:is_process_alive(Pid1).
分别查看输出的结果,并且思考原因。
下面总结几个小点:1,当一个进程死掉之后,一条退出信号会广播给所有和这个进程有link的进程
2,这个信号的会包括退出原因,但是这个原因有可能是任何erlang的数据结构
3,进程可以使用exit(Reason)来使自己退出
4,eixt(Pid,Reason),如果Pid进程是普通进程,那么普通进程将会退出,如果
Pid进程是系统进程,那么当Reason不是kill时,系统进程不管是否捕获发来的
消息,系统进程都不会退出,但是如果Reason是kill时,那么不管该进程是什么
类型的进程都将退出。而当前的进程处于假死状态,还会继续存活着。进程完成
了自己的工作而退出的时候,这时候的退出原因是normal,其他进程(必须是系统
进程)收到的消息是{'EXIT',Pid,normal},而普通进程却不能捕获任何信息,并且
不会退出		
system process
1,调用process_flag(trap_exit,true)就可以将一个普通的进程编程系统进程
2,到一条非normal的退出信号送到一个普通进程的时候,普通进程就会挂掉
3,如果是到一个系统进程的话,将会把这个退出信号打包成一条普通的消息
{'EXIT',Pid,Why}存放在邮箱里
4,另外,可以发送一个kill消息给一个进程,无论是不是系统进程,进程都
将挂掉,并且广播一个killed的消息给链接的进程,这个功能要小心使用,一
般是系统来杀掉没事干的进程用的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值