解决Linux下Erlang关闭port同时也关掉与其连接的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端口关闭,然后强行将自己退出。

更多详情见请继续阅读下一页的精彩内容:

Erlang 的详细介绍:请点这里
Erlang 的下载地址:请点这里

在CentOS上编译安装Erlang R15B

Ubuntu 11.10 搭建Erlang环境

在 CentOS 5.7 上通过 YUM 安装 Erlang 过程

Erlang---启动参数学习/研究

CentOS 5.5 下源代码编译安装 Erlang

Ubuntu 10.10下源码安装Erlang 5.8.3版本

在 CentOS 6.4上安装Erlang

Ubuntu 下 Erlang R16B 的安装

  • 1
  • 2
  • 3
  • 下一页

相关内容