模擬命令行調(diào)用可執(zhí)行程序,在 c++/c++ 中并非難事,但細(xì)節(jié)處理稍有不慎,就會(huì)導(dǎo)致程序無(wú)法正常運(yùn)行。 我曾經(jīng)在開(kāi)發(fā)一個(gè)自動(dòng)化測(cè)試工具時(shí),就因?yàn)楹雎粤艘粋€(gè)小小的細(xì)節(jié),導(dǎo)致程序一直報(bào)錯(cuò),浪費(fèi)了半天時(shí)間才找到問(wèn)題所在。
核心在于使用 system() 函數(shù)或 popen() 函數(shù)。 system() 函數(shù)較為簡(jiǎn)單,直接執(zhí)行一個(gè) shell 命令,適合簡(jiǎn)單的調(diào)用場(chǎng)景。例如,你想運(yùn)行一個(gè)名為 myprogram 的可執(zhí)行程序,只需:
#include <cstdlib> #include <iostream> int main() { int result = system("./myprogram"); // 注意 ./ 表示當(dāng)前目錄 if (result == 0) { std::cout << "程序執(zhí)行成功!" << std::endl; } else { std::cerr << "程序執(zhí)行失敗,錯(cuò)誤碼:" << result << std::endl; } return 0; }
登錄后復(fù)制
這段代碼簡(jiǎn)潔明了,但它有一個(gè)顯著的缺點(diǎn):無(wú)法獲取可執(zhí)行程序的輸出結(jié)果。 我之前就犯過(guò)這個(gè)錯(cuò)誤,直接用 system() 調(diào)用一個(gè)需要打印結(jié)果的程序,結(jié)果程序運(yùn)行了,但是輸出我卻看不到,調(diào)試了好久才發(fā)現(xiàn)問(wèn)題。
這時(shí),popen() 函數(shù)就派上用場(chǎng)了。它允許你創(chuàng)建一個(gè)管道,將可執(zhí)行程序的標(biāo)準(zhǔn)輸出或標(biāo)準(zhǔn)錯(cuò)誤重定向到你的 C/C++ 程序中。 舉個(gè)例子,如果 myprogram 會(huì)輸出一些信息到標(biāo)準(zhǔn)輸出:
#include <stdio.h> #include <stdlib.h> #include <iostream> int main() { FILE *stream = popen("./myprogram", "r"); // "r" 表示讀取標(biāo)準(zhǔn)輸出 if (stream == NULL) { std::cerr << "打開(kāi)管道失?。? << std::endl; return 1; } char buffer[1024]; while (fgets(buffer, sizeof(buffer), stream) != NULL) { std::cout << buffer; // 將程序輸出打印到控制臺(tái) } pclose(stream); // 關(guān)閉管道,非常重要! return 0; }
登錄后復(fù)制
這段代碼會(huì)讀取 myprogram 的輸出,并將其打印到控制臺(tái)。 注意 pclose() 函數(shù),它用于關(guān)閉管道,釋放資源。 忘記調(diào)用 pclose() 會(huì)導(dǎo)致資源泄漏,尤其是在循環(huán)調(diào)用 popen() 的情況下,問(wèn)題會(huì)更加嚴(yán)重。我曾經(jīng)因?yàn)橥涥P(guān)閉管道,導(dǎo)致程序運(yùn)行一段時(shí)間后崩潰,最終發(fā)現(xiàn)是內(nèi)存泄漏引起的。
最后,需要注意的是,./myprogram 中的 ./ 表示當(dāng)前目錄。如果你的可執(zhí)行程序不在當(dāng)前目錄下,需要提供完整的路徑。 此外,還需要確保你的可執(zhí)行程序具有執(zhí)行權(quán)限。 這些細(xì)微之處,往往是調(diào)試過(guò)程中最容易被忽略,卻又最讓人頭疼的地方。 只有仔細(xì)處理每一個(gè)細(xì)節(jié),才能確保程序的穩(wěn)定性和可靠性。
路由網(wǎng)(www.lu-you.com)您可以查閱其它相關(guān)文章!