erlang学习一
程序员文章站
2022-07-12 21:27:06
...
经过一个下午的努力,终于把问题解决了。跟一个在网上认识的Erlang也是初学者,但是在java,vc是高手的前辈讨论了一下。像Erlang这种东西真的要多多动手,光看书真的很不够,尤其看erlang程序设计这本书,我个人觉的字字是宝,但是里面很多文字,经常性看了而不能把关键性的地方给记住,就像今天,就是没注意书中的话,导致各种调试都发现不知为什么。
命令行下调用:
c(process_test).
Pid = process_test:start_a().
Pid1 = process_test:start_b(Pid).
坑爹,发现Pid进程没有收到exit(Pid,stop)发出退出的信息。而且调用
erlang:is_process_alive(Pid)
erlang:is_process_alive(Pid1)
都返回了false..说明Pid进程没有收到exit(Pid,stop)发出的信息。。。。为什么会这样呢?于是重新在erlang程序实际一书寻找打算。结果发现这样一段话:
"你在进程Pid1中调用exit(Pid2,X),就可以让Pid1显式地向一个进程Pid2发送一个退出信号X。发送退出信号的进程没有死亡,发送信号后它会继续执行。但是Pid2仍然会收到一个{'EXIT',Pid1,X}消息(前提是它正处于退出信号捕获状态),这与同源进程已经消亡时发生的情况完全相同。使用这个方法,Pid1可以装死(这通常是故意的)."于是我把代码修改成:
同样的调用还是不行。。这到底是为什么啊,难道是书上出现了。于是就一个下午的找资料。到最后还是重新看看Erlang程序设计,结果又发现新收获:
"系统进程:当进程接收到一个非正常的退出信号时它自己也会消亡,除非它是那种特殊类型的进程即系统进程。当Pid进程向一个系统进程发送一个内容为Why的退出信号时,系统会把退出信号转换为消息{'EXIT',Pid,Why}然后送入系统进程的邮箱".
看来接收exit(Pid,stop)发出的信息必须要是系统进程啊。。。于是重新修改代码
重新调用,OK了,一切都正常,可以接收exit发送的信号。。。
看来只有系统进程才能接收exit()发出的信号。。。
另外从这个例子重新发现了一点,见代码
就是把 {'EXIT',Pid,Why} ->
io:format("Receive hello.~p~n",[Why]);注释掉。。
那么就是exit()发出的信号系统进程没有接收处理,如果一般进程不管有没有这段代码这个进程都会退出,除非是exit(normal)才不会退出,但是对于系统进程来说是不会的退出,系统进程退出只要在接收Kill才会退出。
-module(process_test). -export([start_a/0,start_b/1,af1/1]). start_a()-> spawn(fun af/0). af()-> io:format("process a created."), receive {hello,X,Y} -> io:format("Receive hello.~p~n",[X*Y]), af(); stop -> io:format("Receive abc. ~p~n",[abc]), af(); abcd -> io:format("Receive abcd. ~p~n",[abcd]), af() end. start_b(Pid)-> spawn(process_test,af1,[Pid]). af1(Pid)-> link(Pid), exit(Pid,stop), receive Y->Y end.
命令行下调用:
c(process_test).
Pid = process_test:start_a().
Pid1 = process_test:start_b(Pid).
坑爹,发现Pid进程没有收到exit(Pid,stop)发出退出的信息。而且调用
erlang:is_process_alive(Pid)
erlang:is_process_alive(Pid1)
都返回了false..说明Pid进程没有收到exit(Pid,stop)发出的信息。。。。为什么会这样呢?于是重新在erlang程序实际一书寻找打算。结果发现这样一段话:
"你在进程Pid1中调用exit(Pid2,X),就可以让Pid1显式地向一个进程Pid2发送一个退出信号X。发送退出信号的进程没有死亡,发送信号后它会继续执行。但是Pid2仍然会收到一个{'EXIT',Pid1,X}消息(前提是它正处于退出信号捕获状态),这与同源进程已经消亡时发生的情况完全相同。使用这个方法,Pid1可以装死(这通常是故意的)."于是我把代码修改成:
-module(process_test). -export([start_a/0,start_b/1,af1/1]). start_a()-> spawn(fun af/0). af()-> io:format("process a created."), receive {'EXIT',Pid,Why} -> io:format("Receive hello.~p~n",[Why]); {hello,X,Y} -> io:format("Receive hello.~p~n",[X*Y]), af(); abc -> io:format("Receive abc. ~p~n",[abc]), af(); abcd -> io:format("Receive abcd. ~p~n",[abcd]), af() end. start_b(Pid)-> spawn(process_test,af1,[Pid]). af1(Pid)-> link(Pid), exit(Pid,stop), receive Y->Y end.
同样的调用还是不行。。这到底是为什么啊,难道是书上出现了。于是就一个下午的找资料。到最后还是重新看看Erlang程序设计,结果又发现新收获:
"系统进程:当进程接收到一个非正常的退出信号时它自己也会消亡,除非它是那种特殊类型的进程即系统进程。当Pid进程向一个系统进程发送一个内容为Why的退出信号时,系统会把退出信号转换为消息{'EXIT',Pid,Why}然后送入系统进程的邮箱".
看来接收exit(Pid,stop)发出的信息必须要是系统进程啊。。。于是重新修改代码
-module(process_test). -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,Why} -> io:format("Receive hello.~p~n",[Why]); {hello,X,Y} -> io:format("Receive hello.~p~n",[X*Y]), af(); abc -> io:format("Receive abc. ~p~n",[abc]), af(); abcd -> io:format("Receive abcd. ~p~n",[abcd]), af() end. start_b(Pid)-> spawn(process_test,af1,[Pid]). af1(Pid)-> link(Pid), exit(Pid,stop), receive Y->Y end.
重新调用,OK了,一切都正常,可以接收exit发送的信号。。。
看来只有系统进程才能接收exit()发出的信号。。。
另外从这个例子重新发现了一点,见代码
-module(process_test). -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 {hello,X,Y} -> io:format("Receive hello.~p~n",[X*Y]), af(); abc -> io:format("Receive abc. ~p~n",[abc]), af(); abcd -> io:format("Receive abcd. ~p~n",[abcd]), af() end. start_b(Pid)-> spawn(process_test,af1,[Pid]). af1(Pid)-> link(Pid), exit(Pid,stop), receive Y->Y end.
就是把 {'EXIT',Pid,Why} ->
io:format("Receive hello.~p~n",[Why]);注释掉。。
那么就是exit()发出的信号系统进程没有接收处理,如果一般进程不管有没有这段代码这个进程都会退出,除非是exit(normal)才不会退出,但是对于系统进程来说是不会的退出,系统进程退出只要在接收Kill才会退出。
上一篇: pscp实现windows和linux远程文件和文件夹传输
下一篇: Linux防火墙的关闭和开启
推荐阅读
-
Pytorch安装的一些问题
-
每天一道算法题(2020.06.18)- 电话号码的字母组合
-
喷水装置(一)
-
小弟我想用帝国cms6.5做个这样的网站,不知帝国是否能达到要求,请大家帮小弟我鉴定一下
-
apache处置第一个请求时响应很慢
-
同一个服务器上如何获取不同项目中的数据?
-
Linux上Oracle误删除一个没有用的dbf表空间文件
-
php中session与thinkphp中session的一些用法
-
PHP,Mysql-根据一个给定经纬度的点,进行附近地点查询–合理利用算法,效率提高2125倍,mysql-2125倍_PHP教程
-
MySQL详解(7)-----------MySQL线程池总结(一)_MySQL