簡體   English   中英

從C ++中已執行的Shell命令獲取返回狀態的安全方法是什么?

[英]What is the safe way of get the return status from an executed shell command in c++

由於cstdlib 的函數std::system(const char* command) 不能保證將從shell返回正確的返回狀態 ,那么我如何使用c / c ++在shell中運行命令並保證將給出我正確的回報價值?

以我為例,我使用以下命令運行:

bool is_process_running(std::string p_name){
  std::string command_str= "ps aux | grep '" + p_name + "' | egrep -v '(grep|bash)'";

  int result(0);
  result= system(command_str.c_str());

  return result == 0;
}

例如,如果我運行ps aux | grep 'my_process' | egrep -v '(grep|bash)' ps aux | grep 'my_process' | egrep -v '(grep|bash)' ps aux | grep 'my_process' | egrep -v '(grep|bash)'直接進入終端,然后echo $? ,我看到它返回0因為my_process正在運行,而當我使用未運行的進程時也返回1 但是,上面的代碼返回一個不同的值。 當我在CentOs 6中進行測試時,該代碼曾經可以工作,但是現在在CentOs 7中不再起作用。 那么,我可以使用什么來運行shell命令並獲得正確的結果呢?

我還找到了使用pidof命令的解決方案,但是我不能使用它,因為pidof不會考慮傳遞給my_process的參數,因為我有許多該過程的實例,每個實例都有不同的參數,因此我不需要。

問題在於不能保證Bash的退出狀態是最后執行的命令的退出狀態。 如果您傳遞的命令中存在錯誤,則無法將其與egrep無法匹配任何內容區分開來。

您需要做的就是獲取退出狀態解析輸出(包括標准輸出和標准錯誤)。 這可以通過復制大部分system功能來完成:首先為輸出創建管道stderrstdout可以使用同一管道),然后派生一個新進程來運行Shell,然后執行Shell和管道

在父進程中,您等待子進程退出 ,並獲取其退出狀態。 如果為零,則說明一切正常,可以丟棄管道中的所有輸出。 如果它不為零,則必須讀取管道的輸出以查看發生了什么,除了egrep失敗以外是否還有其他錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM