天天看點

開啟一個新的終端并執行特定的指令

我的項目中有利用到遠端控制,從windows端遠端控制linux端,那麼也就是接收遠端的指令并在本機執行并傳回結果。在父程序中用到popen()函數,popen()函數通過建立一個管道,調用fork()産生一個子程序,執行一個shell以運作指令來開啟一個程序。但是popen 函數是會阻塞的,子程序不結束父程序是不會執行的,這對于我就很不利,我在popen函數中執行的是一個長時間的指令,不可能等到它結束。想要不讓子程序一直阻塞,有許多辦法,比如開啟一個定時器,時間一到結束子程序。但是有一個問題是如何結束該子程序,也就是如何擷取該子程序的ID?我在網上搜了很多,也找到一些方法,但我感覺不行,于是就隻能有一個相對來說比較笨一點的辦法了。

那就是開啟一個新的終端來執行這個耗時的指令,那麼父shell中就可以執行其他的指令。話不多說,貼出代碼:

system("gnome-terminal -x ffplay /home/levo/beyond.mp3");
//或者用popen函數
popen("gnome-terminal -x top","r");
           

其實我首先找到的不是-x,而是-e參數,結果發現開啟的新shell,瞬間就關閉,試了好幾個指令都是這樣,不到一秒鐘就關閉。後來一想,-x才是代表執行的意思嘛。最常見的就是chmod 中的+x參數。

//用這條指令終端會瞬間關閉
system("gnome-terminal -e ffplay /home/levo/beyond.mp3");
           

那麼如何關閉用這兩個函數開啟的子程序呢?擷取ID?并不是那麼容易,當然我的辦法還是最笨的,因為我知道指令名啊,那不是很簡單:

killall ffplay;
//killall top;
           

因為新開啟了shell,是以父shell中并不阻塞,任然能夠執行後邊的指令。

那麼有沒有其他的方法呢?答案是有。比如:将你的程式寫成一個帶GUI界面的程式,那麼用上面兩個函數開啟子程序,将不會阻塞你的主程式。當然這對我并不适用。

OK,就到這!

拙見,小記!