2017-07-19 57 views
-3

我有一個爲我正在開發的基於Qt的C++應用程序開發小型依賴關係管理器的需求。這個C++應用程序將針對Linux系統。所以這就是它的工作原理。我通過system()函數執行一個shell腳本。在shell腳本中,我檢查是否安裝了所需的軟件包,如果沒有,請使用上次執行的命令的狀態退出shell腳本。我的問題是,我們如何在C++中捕獲並處理它? (我想捕捉它,所以我可以告訴,一些依賴關係都沒有安裝的用戶,並尋求用戶權限來安裝它們)在C++中捕獲shell腳本退出狀態

C++代碼:

system("./myscript.sh"); 

shell代碼:

iwconfig 
exit $? 

我已經試過這種形式給出早些時候:

用C

++:

int i = system("./myscript.sh"); 
if(i!=0) 
QMessageBox::information(this, tr("test"), tr("program exited with exit code"+i)); 

但後來我得到以下錯誤: 劣勢停止,因爲它從操作系統收到信號。信號名稱:SIGSEGV信號含義:分割故障

如何完成?

原型
+0

QtCreator在出現錯誤時顯示什麼? –

+0

如果您使用退出代碼退出程序+ std :: to_string(i)'',它會更好嗎? –

回答

1

system命令是:

int system(const char *command); 

它返回命令的退出代碼,它執行(在您的示例外殼腳本)。所以你只需使用:

int status = system("./myscript.sh"); 
+0

這對於如何解釋返回碼有一些有用的鏈接:http://en.cppreference。com/w/cpp/utility/program/system –

+0

@ikleschenkov我試過,它給了我下面的錯誤:劣勢停止,因爲它從操作系統收到信號。 信號名稱: SIGSEGV 信號含義: 分割故障 –

0

我開發一個基於Qt的C++應用程序我開發一個小的依賴管理的要求。

您應該考慮而不是使你的(或部分公共)分配一個適當的package(例如,一些.deb file爲Debian或Ubuntu),因爲包管理器做這個工作(移交依賴關係管理),比你可以合理地更好。


system(3)返回代碼實際上是waitpid(2)給出的狀態代碼。閱讀關於bash和貝殼的exit status。因此,如果最後執行的命令(通過/bin/sh -csystem(3)啓動)與SIGSEGV崩潰(見signal(7) ......),你可以使用WIFSIGNALED然後WTERMSIG

我想,一些方案由您./myscript.sh墜毀經營不善。

您可能會考慮在腳本中使用shell trap builtin來處理該問題。

相關問題