歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

解決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端口關閉,然後強行將自己退出。

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2013-11/92638p2.htm

Erlang 的詳細介紹:請點這裡
Erlang 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved