Qprocess把我的linux命令搞砸了(我想).如何修复
Qprocess messes my linux command up (i think). how to fix?
我需要强制我的c++QT4应用程序从linux命令中读取结果。我正在尝试使用Qprocess,但一旦我的命令变得复杂,它就会莫名其妙地变得一团糟(只是猜测(,而且不起作用。
在这里,我试着给余举一个小例子:
QProcess process;
command = "ls -l | grep a | sort";
qDebug() << "Execute command -> "+command;
process.start( command );
process.waitForFinished(-1);
QString processStdout = process.readAllStandardOutput();
QString processStderr = process.readAllStandardError();
qDebug() << "Std out -> "+processStdout;
qDebug() << "Std err -> "+processStderr;
这将打印:
Execute command -> ls -l | grep a | sort
"Std out -> "
"Std err -> ls: |: No such file or directory
如果从控制台运行,while将正确打印文件名。
如果我用command = "ls -l";
之类的更简单的东西代替comman,它就不会平滑工作操作系统在标准错误时返回错误。
我猜,用于该命令的Qstring会以某种方式被操纵。知道发生了什么吗?
QProcess
不支持shell命令。因此,管道符号不由shell进行解释,而是直接传递给ls
。ls
将其解释为文件名,并抱怨,因为显然没有名为|
的文件。
您需要通过重定向QProcess对象的输入和输出流来手动设置管道。阅读文档以了解如何做到这一点。
一般来说,应该如何避免shell命令,而是依赖于Qt类和函数。当然不需要调用grep
或ls
,因为使用QRegExp
和QDir
可以更容易地实现这一点。如果需要执行子流程,请使用::start(const QString&, const QStringList&, OpenMode)
重载并将所有参数作为列表传递,以避免引用问题。
试试这个:
从QProcess运行shell并将参数传递给shell。示例:
QStringList options;
options << "-c" << "ls -l | grep a | sort";
QProcess process;
process.start("/bin/sh", options); //Use sh or another shell
让我知道这是否有效。
command = "ls -l | grep a | sort";
实际上不是一个进程,而是由三个不同进程组成的管道:ls、grep和sort。
感谢大家的帮助。
为了做我需要的事情,我不得不使用来更改方案
std::string cmd("/sbin/ifconfig eth0");
FILE* pfd = popen(cmd.c_str(), "r");
if (pfd)
{
while (!feof(pfd))
{
char buf[1024] = {0};
if (fgets(buf, sizeof(buf), pfd) > 0)
{
std::cout << "buf = " << buf; // a newline is already present
}
}
pclose(pfd);
}
相关文章:
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 我想访问std::unique_ptr中的一个特定元素
- 我想做一个彼此不同但重复出现的数字
- 我想知道长双倍和双倍之间的区别
- 如何设置一个范围来提取我想要获得的信息
- C++.我想将更改后的特定字符行保存在字符串中
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 我是 C++ 的初学者,我想知道如何在 2D 矢量中获取重复值
- 我是 c++ 的新手.学习基本知识后,我想做井字游戏.对于印刷板,我在下面写代码,但它显示错误
- 我想通过带有C++和Python的插件创建一个可扩展的应用程序
- 如果我想在没有更新编译器的情况下使用新功能,该怎么办?
- 我想在C++中读取一些多个字符,但它永远不会读取第二个字符
- 链接列表运算符重载没有打印出我想要的内容
- 我想生成许多矩阵并用随机数填充它
- 我有一个数组,我想输入一个范围,然后找到范围内所有偶数的总和?
- 如何在 Gnuplot 中分别绘制 2 个文件数据?我有一个文件"sin.txt",另一个文件"cos.txt",我想将它们分别绘制在一个图表上
- 我想在 Main 中用 C++ 调用其他类中的一个类,但我做不到
- 在什么情况下,我想在 C/C++ 代码中使用内联汇编代码
- 在这个函数中是有缺陷的,因为取消引用 null 是无效的,所以我想更改代码
- Qprocess把我的linux命令搞砸了(我想).如何修复