FTXUI 終端簡易音樂播放器
這次我們來寫一個簡單的音樂播放器界面。它有一個輸入框,用戶填寫音樂文件的路徑,按下播放鍵,音樂就會開始播放,并且播放按鈕變成停止按鈕。按下停止按鈕,音樂停止,播放按鈕又會重新出現(xiàn)。
為此,我們會啟動一個新的進程用來播放音樂。用新進程播放音樂的好處就是,就算播放的時候什么都做不了,也不會影響到用戶界面的運行。用戶界面會繼續(xù)接收用戶的輸入和刷新界面。
那么,這次還會涉及一些多進程的知識。
首先我們要明確一點,“fork”函數(shù)在父進程和子進程中的返回值是不同的。在父進程中,“fork”返回新創(chuàng)建的子進程的進程PID,而在子進程中,“fork”返回0。所以,“pid”變量在父子進程中的值是不同的:在父進程中,它是子進程的“PID”;在子進程中,它是0。
這段代碼中,“PID”的初始值設(shè)為0,表示沒有子進程。當(dāng)?shù)谝淮吸c擊按鈕時,會調(diào)用“fork”生成一個子進程。在父進程中,“fork”返回的是子進程的PID,這個值被賦給pid變量;而在子進程中,“fork”返回的是0,這意味著此時的pid變量仍然是0。
進程相關(guān)的部分主要集中在“Button”的回調(diào)函數(shù)里。這個回調(diào)函數(shù)定義了當(dāng)用戶點擊按鈕時應(yīng)該執(zhí)行的操作。
如果用戶首次點擊按鈕,即“pid”為0,“fork”被調(diào)用并創(chuàng)建一個新的子進程。在子進程中,“E-X-E-C-L-P”函數(shù)被調(diào)用,它用于替換當(dāng)前進程的映像(即當(dāng)前正在執(zhí)行的程序)。在這個例子中,子進程的映像被替換為“MPG一二三”程序,并傳入File Name作為參數(shù),這就啟動了音樂播放。之后,按鈕的標(biāo)簽從"Play"變?yōu)?#34;Stop"。
如果用戶再次點擊按鈕(即pid 不等于 0,也就是已經(jīng)有一個子進程在運行),則“kill”函數(shù)被調(diào)用,向子進程發(fā)送一個“Kill”信號,這會導(dǎo)致子進程終止。然后,pid被設(shè)置為0,按鈕的標(biāo)簽再次變?yōu)?#34;Play"。
這個程序依賴于"mpg123"來播放音頻文件,確保安裝了"mpg123"~