2014-01-23 64 views
0

我需要從Erlang運行UNIX進程,並將TCP套接字設置爲標準輸入。那可能嗎?Erlang:將tcp套接字作爲標準輸入傳遞給UNIX進程

現在我有一個TCP套接字,我從Ranch得到了,我可以得到它的文件描述符,但我不確定如何將它設置爲我創建的UNIX進程的標準輸入。透過open_portdocumentation沒有提供任何線索如何做到這一點。

我需要這樣做的原因是我調用的過程是硬編碼的,希望它的標準是一個套接字,如果不是,它會崩潰。這意味着我不能用open_port打開它,並將TCP流代理到它。

我在Ubuntu 12.04上運行。

+0

您是否考慮過創建FIFO?用os:cmd調用mkfifo,打開新文件用file:open打開,用os:cmd來調用外部進程?沒有遠程優雅,但應該做的伎倆。 – macintux

+0

最終進程是否將FIFO看作TCP端口?現在它聲明stdin是一個IPV4或IPV6套接字。不是我會做的,但我沒有在該應用程序的專業知識...... – kjw0188

回答

0

你有兩個問題:能夠I/O調用到插座,並使其過程standard_io用於I/O:

  • 每一個過程都有組長這是一個過程所有在呼叫中沒有特定I/O設備的I/O請求都被髮送到該服務器。這可以使用BIF erlang:group_leader/2來設置流程的組長。當一個進程產生時,組長會被繼承,這就是爲什麼從shell產生的所有進程都會將其輸出與shell相同的輸出,即使它在另一個節點上產生。

  • 接下來的問題是修復它,以便您可以在您的TCP套接字上執行Erlang I/O請求,例如io:format。 Erlang中的所有I/O都必須通過一個實現Erlang i/o protocol的I/O服務器。它是處理來自Erlang代碼的I/O請求並將它們轉換爲從外部發送/接收數據的I/O服務器。我已經在GitHub上實現了TCP i/o server。沒有任何文檔,但在底部有一些例子,例如打開一個監聽套接字的例子,並且爲每個新連接啓動一個通過該套接字處理I/O的shell。這實際上是非常短的代碼。

所以這基本上是你需要做的,以獲得進程/進程組和TCP端口之間的I/O。

+0

感謝您的回答,但我認爲在我的問題中,操作系統和Erlang過程之間存在一些術語混淆。我試圖在編輯時更加清晰。 – kjw0188

相關問題