日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

开启一个新的终端并执行特定的命令

發(fā)布時間:2023/11/27 生活经验 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 开启一个新的终端并执行特定的命令 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

我的項目中有利用到遠程控制,從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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。