加入收藏 | 设为首页 | 会员中心 | 我要投稿 常州站长网 (https://www.0519zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

处理Linux下Erlang关闭port同时也关掉与其连接的C语言进程

发布时间:2021-11-20 18:47:00 所属栏目:教程 来源:互联网
导读:在Linux平台下,erlang通过普通端口与c语言进行通信时,当erlang主动调用BIF port_close关掉端口时,在linx下执行ps -e|grep cPort后,c语言进程并没有退出。此现象称erlang中port胡僵尸进程问题。 认真分析后发现在关闭port时,在stdin上会得到一个eof,而c
在Linux平台下,erlang通过普通端口与c语言进行通信时,当erlang主动调用BIF port_close关掉端口时,在linx下执行ps -e|grep cPort后,c语言进程并没有退出。此现象称erlang中port胡“僵尸”进程问题。
 
认真分析后发现在关闭port时,在stdin上会得到一个eof,而c进程无法据此退出。c语言进程根据feof(0),可以检测到端口关闭,然而当erlang通stdin向c语言发消息时,stdin同样会得到eof,当c语言检测到eof时,无法区分是端口关闭还是erlang发消息,这种方法会出现一种现象每当erlang向c语言发消息,c进程都会退出,不能连续发消息;为此寻求新的解决方法,经过探索终于发现
 
借助于信号机制,当erlang关闭端口时,会关闭stdin(将stdin设eof),c语言在stdin关闭的情况下,再次写管道时(stdout)时,会收到SIGPIPE信号,按正常情况,进程收到SIGPIPE后会退出,然而linux下该进程并没有退出,需要通过signal函数捕获该信号后,强制exit(0),让进程退出。
 
总结:erlang的port_close过程做了二件事:一是将stdin置feof;二是将stdin关闭,在windows下c进程只要保持对stdin的侦听,只要erlang关闭port,c进程马上退出;在linux平台下,c进程需要保持对stdin和stdout的侦听,在port_close时,会收到SIGPIPE信号,据此信号判断erlang端口关闭,然后强行将自己退出。

(编辑:常州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读