很多时候我们需要 上层代码需要执行 shell 命令,但还要有返回值,例如需要获取 ls 的返回值
接下来介绍几种编程语言的获取命令的返回值的方法
第一种 C++
代码如下:
#include <iostream> #include <string> #include <stdio.h> int exec_cmd(std::string cmd, std::string &res){ if (cmd.size() == 0){ //cmd is empty return -1; } char buffer[1024] = {0}; std::string result = ""; FILE *pin = popen(cmd.c_str(), "r"); if (!pin) { //popen failed return -1; } res.clear(); while(!feof(pin)){ if(fgets(buffer, sizeof(buffer), pin) != NULL){ result += buffer; } } res = result; return pclose(pin); //-1:pclose failed; else shell ret } int main(){ std::string cmd = "ls -ial"; std::string res; std::cout << "ret = " << exec_cmd(cmd, res) << std::endl; std::cout << res << std::endl; return 0; }
运行结果:
ret = 0 总用量 164 17 drwxrwx--- 1 root vboxsf 4096 12月 25 17:09 . 1 drwxrwx--- 1 root vboxsf 8192 12月 18 17:11 .. 9325 -rwxrwx--- 1 root vboxsf 14652 12月 25 16:56 a.out 55 drwxrwx--- 1 root vboxsf 4096 11月 5 16:20 c++ 57 drwxrwx--- 1 root vboxsf 4096 11月 5 15:17 DesignPatterns-master 7701 -rwxrwx--- 1 root vboxsf 94688 11月 5 09:01 DesignPatterns-master.zip 79 drwxrwx--- 1 root vboxsf 4096 8月 26 08:59 gototext 9328 -rwxrwx--- 1 root vboxsf 14652 12月 25 17:09 main 9324 -rwxrwx--- 1 root vboxsf 722 12月 25 17:07 mianText.cpp 82 drwxrwx--- 1 root vboxsf 4096 11月 5 16:02 text1 54 drwxrwx--- 1 root vboxsf 4096 11月 5 15:17 .vscode
第二种 QT 开启进程的方法
代码如下:
// 调用 QProcess 头文件 开个进程绑定信号 在槽函数提取自己想要的数据
userNameProcess = new QProcess; userNameProcess->start("who"); connect(userNameProcess,SIGNAL(readyReadStandardOutput()) ,this, SLOT(getUserNameProcessSlot())); void MainWindow::getUserNameProcessSlot() { QString temp = userNameProcess->readAll(); Singleton::mutexWiFi.lock(); Singleton::userNameGlobal = temp.mid(0,temp.indexOf(" ",0)); Singleton::mutexWiFi.unlock(); qDebug() << "用户名:" <<Singleton::userNameGlobal<< endl; }
第三种 python
代码如下:
import commands status, output = commands.getstatusoutput('ls -lt') print status print output