2014-08-30 88 views
0

對不起,如果標題沒有任何意義,這是我所能想到的。如何與分叉後臺進程進行通信/接口?

我正在學習如何在* nix系統(在我的情況下是Linux)中工作,我知道一點點,但我想弄清楚如何做到這一點,如果可能的話,我找不到任何關於可能因爲我不知道該怎麼稱呼它。

我解釋這將是舉個例子,最好的辦法:

說我有工作在終端中的音樂播放器,讓我們把它稱爲「musicplayer」。 我想播放聲音文件,所以我會執行此命令:

musicplayer play "/path/to/music.mp3"

那麼這會在後臺運行,我回到了我在終端提示,我可以從完全退出終端和聽到背景等音樂...

說半途首歌我想暫停:

musicplayer pause

一些如何在音樂停頓d。

這將如何工作? (我的意思是在這個過程中,音樂只是一個例子,問題不在於音樂)。

在我看來,這就是發生了什麼:[fork and play music] - > [告訴fork暫停]。

我對流程的主題不是很瞭解,所以對此的任何幫助/解釋都非常感謝。

我不需要代碼示例必然,只是在邏輯上這是如何工作的,但如果你想給你的例子可以給他們在C.

先感謝您的任何解釋。

+0

實際上並不需要(也不是)這裏涉及的任何「分支」(不包括將進程作爲守護進程運行);隨後每次調用'musicplayer'可執行文件都會啓動一個新的*獨立*進程。 – user2864740 2014-08-30 06:20:07

回答

2

您需要了解分叉processes不共享(隱式)任何數據;從概念上講,父母和子女進程各有其自己的address space,並擁有自己的數據副本(使用lazy copy on write技術)。見fork(2)

因此,你需要讓他們明確地溝通和pipe(7) -s,fifo(7) -s,socket(7) -s,共享內存shm_overview(7)旗語sem_overview(7),同步eventfd(2)或任何其他意味着Linux提供你。

所以請閱讀Advanced Linux Programming並瞭解在Linux上可用的syscalls(2)Inter Process Communication。不要忘記處理系統調用失敗。

對於您的music play命令,您可以設置IPC和fork(另請參閱daemon(3)以在後臺分支守護進程)。

對於你的music pause你會與其他進程通信。 (您可能會考慮使用kill(2)停止SIGSTOP​​的過程...)

你需要在你的腦袋建設的所有可用來選擇相關的那些IPC功能的圖像您的具體情況

BTW,在Linux上存在一些命令行音樂播放器爲免費軟件。你可以研究他們的源代碼和/或他們的執行。

+0

我明白了。感謝所有的信息(在您編輯的過程中保持閱讀!:D)。我認爲最好的做法可能是使用套接字進行通信。我一定會看看你鏈接的閱讀材料。再次感謝。 – APott 2014-08-30 05:57:18

+0

太棒了。感謝您的例子。這篇文章幫助了很多,謝謝! – APott 2014-08-30 06:03:38

2

我想添加一件事情給Basiles答案:這是一個非常普遍的問題,所以幾乎可以肯定你不必自己處理細節(這可能非常複雜)。良好的應用程序框架將爲您提供解決方案,以便您可以專注於使應用程序變得更好。

作爲一個例子,看看GLibs GApplication:它處理應用程序的唯一性,所以第一個實例將繼續運行,任何後續的應用程序調用將只發送一個D-Bus消息到原始實例並退出。原始實例中的GApplication對象會發出一個信號,告訴您的應用程序,例如,在命令行上啓動了音樂播放器實例,並且參數爲「暫停」。