2013-03-01 97 views
0

大家好我是新來的C很抱歉,如果我很迷路。我在嘗試創建這個多線程的Web服務器時遇到問題。我試圖...C - execvp()進程間通信

  • 有一個線程創建一個新的線程
  • 有一個新的線程中執行execvp()調用不同的C程序我的機器上
  • 有新的線程返回流來自execvp()的數據

我在想使用pthreads來產生一個新的進程來運行execvp()並讓它通過管道返回數據。但是,這甚至是必要的嗎?不要pthreads共享內存?

此外,我可能想使用fork()而不是pthread,並讓孩子通過管道將數據發送回父級。

你能幫我指導一下正確的方向嗎?

回答

2

什麼你要找的是的exec功能fork(),一個和pipe()組合(或者socketpair()或東西,但管工作太)。

線程共享內存,但execvp()會創建一個全新的進程來替換調用者進程 - 即使此進程與其父進程共享內存(我不確定它的確如此!),新運行的程序不會執行「不知道如何使用那個記憶。

正確的方法是在您還有一個進程時打開一個管道,fork()分爲兩個進程(父進程和子進程),並讓子進程調用execvp()。孩子現在可以寫入管道的末端,父母可以從另一端讀取。

請記住wait()爲孩子結束。

+0

啊謝謝。那麼execvp()如何正確工作。如果子進程調用execvp(),它將成爲execvp()調用的程序,或者它會產生另一個單獨運行execvp的線程,並等待execvp完成並加入。不知道這是否甚至有意義,或者如果在這種情況下甚至是重要的,我只是好奇 – user1367263 2013-03-01 08:27:14

+0

當進程調用任何'exec'函數時,該進程本身就成爲被調用的程序。這就是爲什麼它很少從父進程調用。所以是的,這就像你描述的第一種情況(「如果孩子調用execvp()它會成爲execvp()調用的程序)」。 – aaaaaa123456789 2013-03-01 08:41:04

+0

此外,您可以進入shell並輸入'man 3 exec'獲取更多信息。或者在這裏查看:http://www.linuxmanpages.com/man3/exec.3.php – aaaaaa123456789 2013-03-01 08:42:04

0

您是否編寫過您的非阻塞單線程Web服務器?如果你沒有什麼可以比較的話,你會如何衡量多線程的好處?如果您將單線程項目公開給併發,那麼確定哪裏獲得最佳性能收益就要容易得多,而不是在項目剩餘時間內猜測並遭受糟糕的框架。

創建線程很簡單,但您首先需要先閱讀pthread_create manual。你還能相信你的項目是否正確地處理錯誤?我也建議閱讀約the other pthread functionality。順便說一句,如果你告訴我你自己試圖解決它們,我很樂意幫助你解決問題。我不會打擾你餵食。

正如aaaaaa123456789提到的,你不希望使用在pthread_create/execvp產卵,因爲這將與新工藝取代你的整個程序環境(包括所有你的線程)。