这里介绍三种不同获取cmd指令的方法,且都支持windows和linux。
方法一(使用QProcess的异步方式来实现):
这里通过QProcess信号槽来实现异步的获取返回值,使用start()来执行才行,如果你用startDetached()执行会把进程分离出去,是无法获取它的状态的。
注意,这里有一个坑,qt无法执行带管道"|“和重定向”>>"的linux指令,需要写入脚本的方式来执行。
这里提供了带管道和不带管道的linux指令执行方法
//方法一:
QProcess *p = new QProcess(this);
connect(p,SIGNAL(finished(int)),this,SLOT(slotFinish(int)));
///注意,这里有一个坑,qt无法执行带管道"|"和重定向">>"的linux指令,需要写入脚本的方式来执行。
///这里提供了带管道和不带管道的linux指令执行方法
#if 1 //带管道
QString cmd = "ps -ef|ls -l";
p->start("bash",QStringList()<<"-c"<start(cmd);
#endif
void Widget::slotFinish(int val)
{
QProcess *p = qobject_cast(sender());
qDebug()<<"cmd finish"<readAllStandardOutput();
}
方法二(QProcess同步方式来获取返回值):
waitForStarted()默认30s,设置-1会一直等待执行完毕。
//方法二:
QProcess p1;
///注意,这里有一个坑,qt无法执行带管道"|"和重定向">>"的linux指令,需要写入脚本的方式来执行。
///这里提供了带管道和不带管道的linux指令执行方法
#if 1 //带管道
QString cmd = "ps -ef|ls -l";
p1.start("bash",QStringList()<<"-c"<
方法三(使用popen的IO接口来实现的):
这里提供两种不同写法。
写法一:
void Widget::executeCMD(const char *cmd, char *result)
{
char buf_ps[1024];
char ps[1024]={0};
FILE *ptr;
strcpy(ps, cmd);
#ifdef Q_OS_LINUX //支持LINUX
if((ptr=popen(ps, "r"))!=NULL)
{
while(fgets(buf_ps, 1024, ptr)!=NULL)
{
strcat(result, buf_ps);
if(strlen(result)>1024)
break;
}
pclose(ptr);
ptr = NULL;
}
else
{
printf("popen %s error", ps);
}
#else //支持windows系统
if((ptr=_popen(ps, "r"))!=NULL)
{
while(fgets(buf_ps, 1024, ptr)!=NULL)
{
strcat(result, buf_ps);
if(strlen(result)>1024)
break;
}
_pclose(ptr);
ptr = NULL;
}
else
{
printf("popen %s error", ps);
}
#endif
}
调用方式:
//方法3
QString cmd = "ps -ef|ls -l";
char result[1024];
executeCMD(cmd.toStdString().data(),result);
qDebug()<<"cmd finish"<
写法二:
QString Widget::getCmdResult(const QString &strCmd)
{
char buf[10240] = {0};
FILE *pf = NULL;
#ifdef Q_OS_LINUX //支持LINUX
if( (pf = popen(strCmd.toStdString().c_str(), "r")) == NULL )
{
return "";
}
#else //支持windows系统
if( (pf = _popen(strCmd.toStdString().c_str(), "r")) == NULL )
{
return "";
}
#endif
std::string strResult;
while(fgets(buf, sizeof buf, pf))
{
strResult += buf;
}
#ifdef Q_OS_LINUX //支持LINUX
pclose(pf);
#else //支持windows系统
_pclose(pf);
#endif
unsigned int iSize = strResult.size();
if(iSize > 0 && strResult[iSize - 1] == '\n')
{
strResult = strResult.substr(0, iSize - 1);
}
return QString::fromLocal8Bit(strResult.c_str());
}
调用方式:
//方法3
QString cmd = "ps -ef|ls -l";
qDebug()<<"cmd finish"<