2010-09-04 47 views
3

允許從一個進程讀取數據,而另一個進程寫入到Erlang的套接字中? 我試過了,它似乎工作,但我想知道它是否萬無一失。從兩個進程訪問套接字

+0

謝謝大家的回答。 Summa summarum:多個進程可以安全地寫入,但只有一個進程可以從套接字讀取。 – mihannus 2010-09-05 20:53:33

回答

3

根據我對源代碼的理解,一個(gen_tcp,至少)socket send/recv歸結爲發送的erlang:port_command和套接字端口上的recv的erlang:port_control(請參見prim_inet。 ERL)。

對於port_command:「如果端口繁忙,調用進程將被暫停,直到端口不再忙。」 port_control也是一個同步操作。

糾正我,如果我錯了,但它似乎是完全安全的使用多個進程來讀取和寫入套接字。

+2

雖然有一條評論,如果「擁有」過程死亡,那麼套接字將關閉。所以這兩個進程之間不是對稱的使用。 – 2010-09-06 11:16:40

1

我很確定我記得這樣做沒有任何問題。

1

他們中的任何一個都可以編寫,但如果您的所有進程都可以接收,則無意義。它會溢出所有不預期消息的郵箱。您只需要定義一個Pid來接收數據包,默認情況下它就是創建套接字的任何Pid。您可以通過設置控制進程來設置任何Pid來控制套接字。

+1

如果使用{active,false}和recv()從套接字獲取數據會怎樣?雖然我不確定,但我希望幾個進程都可以調用recv(),這樣可以正常工作。 – 2010-09-06 20:57:00

+0

這是真的。我很難想象在不同的​​進程調用recv的socket間傳遞。更好地使活動並有一個專門的循環接收{tcp,Sock,Data}。至少這是我習慣與他們合作的方式。 – 2010-09-09 02:16:14

相關問題