解决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 的下载地址:请点这里
相关阅读: