Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 带QProcess的管道(或命令链)_C++_Qt_Shell_Qprocess_Chain - Fatal编程技术网

C++ 带QProcess的管道(或命令链)

C++ 带QProcess的管道(或命令链),c++,qt,shell,qprocess,chain,C++,Qt,Shell,Qprocess,Chain,我在上面使用Qt和bash,需要执行如下操作: bash: cat file | grep string 在Qt中: QString cmd = "cat file | grep string"; QProcess *process = new QProcess; process->start(cmd); process->waitForBytesWritten(); process->waitForFinished(); qDebug() << process-

我在上面使用Qt和bash,需要执行如下操作:

bash: cat file | grep string
在Qt中:

QString cmd = "cat file | grep string";
QProcess *process = new QProcess;
process->start(cmd);
process->waitForBytesWritten();
process->waitForFinished();
qDebug() << process->readAll();
一切都好。 我试过smth。像

"cat file \\| grep string", 
"cat file \| grep string" 
但结果是一样的。如果我复制命令并在bash中运行它,一切都正常

QString::toAscii().data()

而其他变换也有不好的结果

问题在于,当您调用process->start(cmd)时,调用cat之后的命令都被解释为cat的参数,因此管道没有执行您期望的操作。如果以字符串参数调用bash开始,则应该得到所需的:-

QString cmd = "bash -c \"cat file | grep string\"";

或者,当您从QProcess读取输出时,您可以调用“cat file”并对返回的QString进行搜索。快速而肮脏的攻击是:

QString cmd = "/bin/sh -c \"cat file | grep string\"";
您还可以使用C++11的
R”“
,避免在其中转义,但关键是不要在其中使用
bash
,因为这将使它只适用于bash。如果没有bash、just ash或任何其他通用桌面shell,它将无法在嵌入式busybox上工作

/bin/sh
通常是指向所用shell解释器的符号链接,因此最终会起作用

但是

我认为在使用高级C++/OOP框架(如Qt)时,您的想法有点太低级了。我不建议在从bash运行命令时以低级方式调用命令。这个用例有一些专用的高级便利API

基于,QProcess应该适用于管道命令:

void QProcess::setStandardOutputProcess(QProcess*目标)

通过管道将此进程的标准输出流传输到目标进程的标准输入

换句话说,command1 | command2 shell命令可以通过以下方式实现:

QProcess process1;
QProcess process2;

process1.setStandardOutputProcess(&process2);

process1.start("cat file");
process2.start("grep string");
process2.setProcessChannelMode(QProcess::ForwardedChannels);

// Wait for it to start
if(!process1.waitForStarted())
    return 0;

bool retval = false;
QByteArray buffer;
while ((retval = process2.waitForFinished()));
    buffer.append(process2.readAll());

if (!retval) {
    qDebug() << "Process 2 error:" << process2.errorString();
    return 1;
}

qDebug() << "Buffer data" << buffer;
qprocessprocess1;
QProcess process2;
进程1.设置标准输出进程(和进程2);
进程1.启动(“cat文件”);
进程2.开始(“grep字符串”);
process2.setProcessChannelMode(QProcess::ForwardedChannels);
//等待它开始
如果(!process1.waitForStarted())
返回0;
bool-retval=false;
QByteArray缓冲区;
而((retval=process2.waitForFinished());
append(process2.readAll());
如果(!retval){

qDebug()问题在于,您无法使用QProcess运行系统命令,而只能运行单个进程。因此,解决方法是将您的命令作为参数传递给bash:

process.start("bash", QStringList() << "-c" << "cat file | grep string");
process.start(“bash”,QStringList()这个怎么样:

QString program = "program";
QStringList arguments;

download = new QProcess(this);
download->start(program, arguments);

如果谷歌把你带到这里,而你使用的是PyQt5或PySide2

        process1 = QProcess()
        process2 = QProcess()
        process1.setStandardOutputProcess(process2)
        process1.start(cat, [file])
        process2.start(grep, [string])   

尝试
cmd=“bash-c'cat文件| grep字符串”
@LaszloPapp没有任何争议…因为有一个专用的API,所以您的答案更好。另一方面,调用shell可能会允许使用更复杂的命令,例如使用进程替换、shell globbing等,因此在某些情况下它可能会有一些优势。为什么不按照我的a对具有高级API的管道命令使用QProcess呢回答?:-)你的答案很好,这只是一个解决办法。你说的“系统命令”是什么意思?你可能指的是更具体的东西,比如“shell命令”。我的意思是在Python中调用像
os.system()
system
来自
@DmitryMarkin:OT,但不要使用os.system()在python中。人们应该按照文档使用子流程模块。该命令运行良好,但是我得到的输出有点杂乱无章……对于这个命令“netstat-i | grep enss33 | awk'{print$3}”“,它得到的结果是0x804d2045085,应该是5085…@kridigitx,我怀疑这可能是由于awk命令是如何通过字符传递的。如果你删除awk并只是通过管道传输到grep,这是否像预期的那样有效?如果有效,添加awk,但转义引号。我已经转义了单引号…仍然是相同的输出…@kri。”sdigitx使用stdout作为变量名可能是一个坏主意。这对我来说很有效:Qdebug也适用于我,使用“输出”"变量与输出使用CUT也没有区别…所以我认为问题是用CUT处理输出……考虑添加更多的细节,使它比当前的答案更好。我希望我能使用这个方法,但对我来说,问题是它不像接受的答案那样工作。我不是管道命令,而是简单的TR。正在执行两个连续命令:gcc*.c;/a.out argv[1]…当我将您的代码与setStandardOutputProcess一起使用时,我得到了奇怪的结果。对长时间运行的进程有什么想法吗?如果process1是一个telnet会话,我希望process2重写该process1 telnet会话的输出,该怎么办?我仍然会向process1发送命令,但需要它将输出传输到process2?欢迎使用代码。
        process1 = QProcess()
        process2 = QProcess()
        process1.setStandardOutputProcess(process2)
        process1.start(cat, [file])
        process2.start(grep, [string])