Linux Qt編程——在程式中啟動其他應用、指令碼

來源:互聯網
上載者:User

       我們在編程過程中,經常會遇到這樣的需求,點擊一下按鈕,啟動另外一個應用程式,或者執行一個指令碼。你一定覺得這個多簡單啊,有什麼可寫的?其實實現同一個功能,不同的開發人員寫出的代碼可能千差萬別,執行效率,容錯率,是否有唯一啟動保護等……當然,我們還是需要通過衡量具體的需求和環境來設計自己的代碼,量體裁衣。

      最簡單的,我們可以通過system直接啟動一個應用程式或者指令碼:

system("./helloworld");system("./hello.sh");

      操作簡單,但是我們可以很清晰的看到弊端:雖然很順利的匹出一個進程去執行另外一個應用,但是我們拿不到這個新進程的任何東西,也就失去了對這個進程的控制權。所以我們可以嘗試利用QProcess:

void Widget::startApps(QString str){     QProcess *proc = new QProcess();    proc->start(str);  }

      拿到proc指標,我們可以做一些我們想做的事情。做嵌入式應用編程的朋友可能時常會受到環境變數的困擾,很納悶為什麼總是找不到這庫那庫。所以我們可以再完善一下:

void Widget::startApps(QString str){     QProcess *proc = new QProcess();    proc->setEnvironment(proc->environment());    proc->start(str);    proc->waitForStarted(); }

      如果我們想要執行的指令碼需要傳參呢?我們有必要完善一下參數列表:

void Widget::startSh(QString str){    QString program = "./hello.sh";    QStringList arguments;    arguments << str;    QProcess *myProcess = new QProcess();    myProcess->start(program, arguments);}

      項目中,我們經常遇到這樣的情況:模組一單獨工作正常,模組二單獨工作也正常,但是整合到一起,在特定的環境下就出這樣那樣的問題。舉一個啟動應用程式的例子:處理序間通訊很容易出錯,進程A發送啟動helloworld的訊息給進程B,進程B接到訊息就啟動helloworld。進程A只發送一次訊息,但是進程B卻接到2個發送任務,連續啟動2個helloworld,這種錯誤很致命,尤其是在記憶體緊張的環境下,但是的確不容易排查。所以,為了避免悲劇的發生,哪怕我們不能準確的定位處理序間通訊的錯誤根源,聰明的程式員依舊可以解決這個問題:

system("ps | grep helloworld |grep -v grep || ./helloworld &");

      如果你還不熟悉指令碼語言,那麼我很樂意解釋一下:ps查看系統進程資訊,grep檢索一下helloworld相關的進程,然後排除掉grep本身這個進程,如果已經存在一個helloworld,那麼不進去執行,如果沒有存在helloworld,就啟動一個helloworld。即完成了單一啟動保護處理。

      如果你需要必須保證啟動一個新的helloworld,那麼依舊有好辦法,先殺掉可能存在的helloworld,然後再啟動,無聲無息:

system("killall helloworld");

      如果不確定應用程式名稱字就是helloworld,我們只需要把命令替換成:

ps aux | grep helloworld | grep -v grep |awk '{print $2}' | xargs kill 2&> /dev/null

      需要提醒的是,根據ps的輸出,找到pid那一列,如果在第一列,則改成print $1 ,Busybox可能會存在差異所以要注意。

      待續……

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.