设为首页 加入收藏

TOP

解决Linux下Erlang关闭port同时也关掉与其连接的C语言进程
2014-11-24 02:31:57 来源: 作者: 【 】 浏览:13
Tags:解决 Linux Erlang 关闭 port 同时 关掉 与其 连接 语言 进程

在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端口关闭,然后强行将自己退出。


相关阅读


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇如何用Java按需定制自己的迭代器 下一篇百度2014移动研发笔试题目——101..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: