开启一个新的终端并执行特定的命令
我的項目中有利用到遠程控制,從windows端遠程控制linux端,那么也就是接收遠程的命令并在本機執(zhí)行并返回結果。在父進程中用到popen()函數(shù),popen()函數(shù)通過創(chuàng)建一個管道,調(diào)用fork()產(chǎn)生一個子進程,執(zhí)行一個shell以運行命令來開啟一個進程。但是popen 函數(shù)是會阻塞的,子進程不結束父進程是不會執(zhí)行的,這對于我就很不利,我在popen函數(shù)中執(zhí)行的是一個長時間的命令,不可能等到它結束。想要不讓子進程一直阻塞,有許多辦法,比如開啟一個定時器,時間一到結束子進程。但是有一個問題是如何結束該子進程,也就是如何獲取該子進程的ID?我在網(wǎng)上搜了很多,也找到一些方法,但我感覺不行,于是就只能有一個相對來說比較笨一點的辦法了。
那就是開啟一個新的終端來執(zhí)行這個耗時的命令,那么父shell中就可以執(zhí)行其他的命令。話不多說,貼出代碼:
system("gnome-terminal -x ffplay /home/levo/beyond.mp3");
//或者用popen函數(shù)
popen("gnome-terminal -x top","r");
其實我首先找到的不是-x,而是-e參數(shù),結果發(fā)現(xiàn)開啟的新shell,瞬間就關閉,試了好幾個命令都是這樣,不到一秒鐘就關閉。后來一想,-x才是代表執(zhí)行的意思嘛。最常見的就是chmod 中的+x參數(shù)。
//用這條命令終端會瞬間關閉
system("gnome-terminal -e ffplay /home/levo/beyond.mp3");
那么如何關閉用這兩個函數(shù)開啟的子進程呢?獲取ID?并不是那么容易,當然我的辦法還是最笨的,因為我知道命令名啊,那不是很簡單:
killall ffplay;
//killall top;
因為新開啟了shell,所以父shell中并不阻塞,任然能夠執(zhí)行后邊的命令。
那么有沒有其他的方法呢?答案是有。比如:將你的程序?qū)懗梢粋€帶GUI界面的程序,那么用上面兩個函數(shù)開啟子進程,將不會阻塞你的主程序。當然這對我并不適用。
OK,就到這!
拙見,小記!
總結
以上是生活随笔為你收集整理的开启一个新的终端并执行特定的命令的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于模态对话框和非模态对话框的创建、显示
- 下一篇: system函数