C++ 如何正确使用QProcess write?
我需要一个程序来与依赖于in-and的子进程通信 输出。问题是我显然无法正确使用C++ 如何正确使用QProcess write?,c++,qt,scanf,qprocess,C++,Qt,Scanf,Qprocess,我需要一个程序来与依赖于in-and的子进程通信 输出。问题是我显然无法正确使用QProcess 下面的代码应该创建一个QProcess,启动它并进入主while循环。在那里,它将子流程创建的所有输出打印到控制台,然后请求用户输入,然后通过write(…)将输入传递到子流程 最初,我在这个场景中遇到了两个问题: 父进程无法读取子进程的printf 子流程中的scanf未接收通过write发送的字符串 至于(1),我逐渐意识到这是由子进程的stdout缓冲引起的问题。通过fflush(stdout
QProcess
下面的代码应该创建一个QProcess,启动它并进入主while循环。在那里,它将子流程创建的所有输出打印到控制台,然后请求用户输入,然后通过write(…)
将输入传递到子流程
最初,我在这个场景中遇到了两个问题:
printf
scanf
未接收通过write
发送的字符串fflush(stdout)
调用或操作其刷新行为,可以轻松解决此问题
第二个问题是我无法解决的问题write
被调用,甚至返回正确的发送字节数。但是,子流程没有继续执行,因为没有新数据写入其输出。scanf
似乎没有收到发送的数据。程序给出的输出为:
子流程应该已经启动。
124字节可用!
正在尝试读取:
阅读:这是一个简单的演示应用程序。
阅读:它只阅读标准文本,并重复其内容。
读取:输入退出以终止。
阅读:---------
等待用户输入:测试
写入5字节
没有要读的行。。。
等待用户输入:
我真的被困在这里了。谷歌+沉重的思想已经在我身上失败了,我想把它传递给你,作为我最后的希望灯塔。如果我只是看不到森林里所有的树,我道歉
如果需要这些信息:我正在使用Qt5和clang编译器处理64位MacOS X。子流程代码是在同一台机器上用gcc编译的
事先非常感谢
天然橡胶
主代码:
intmain(){
//用于执行子流程的命令
QString程序=“./demo”;
qprocesssub;
sub.start(程序,QProcess::Unbuffered | QProcess::ReadWrite);
//检查子流程是否正确启动。
如果(!sub.waitForStarted()){
std::cout这将不起作用。您正在等待写入发送的字节,但没有等待回显。相反,您正在输入getline()函数,等待新的用户输入。请记住,这里涉及两个进程,每个进程都可能延迟到任何程度
除了此之外,您应该考虑异步构建QT应用程序(具有事件循环)而不是尝试同步方法。通过这种方式,您的Qt应用程序可以并行执行操作…例如,读取输入或等待远程进程的输入,同时仍然无法阻止并能够接受用户输入。
您是否尝试过sub.waitforbytesWrite()
在sub.write(“\n”)之后
?编辑:我刚刚尝试过,但没有改变结果。子流程仍然拒绝生成新的输出。仔细想想,这不是到目前为止的预期结果吗?您写出了数据,并将其发送到了子流程,子流程甚至可能已经收到并处理了它,但我希望父流程是正确的检查if(!sub.canReadLine()){
要快得多。如果是这样,那么在您的子流程有时间做出反应之前,您的父流程再次等待您的输入,而不是子流程。您可以编写更多的输入并查看子流程到那时是否有输出吗?sub.canReadLine()
始终为false,无论写入了多少输入。调用sub.bytesavable()
也始终返回相同的数字。bool QIODevice::canReadLine()const[virtual]
如果可以从设备读取完整的数据行,则返回true;否则返回false。请注意,无法确定可以读取的内容的未缓冲设备总是返回false。因此,您将QProcess
声明为QProcess::unbuffered
…我想您比我在中解释得更好我的评论。可能是关于竞争条件的模糊。因此QProcess与主进程同步运行,这意味着getline()有效地阻止了子进程?不。在其他进程发送回显之前,您正在输入getline()。在等待getline()时(这是一个阻止函数调用!)您无法从另一个进程读取任何延迟的回显。好的。因此,当子进程打印最后一次写入的回显时,主程序卡在getline。因此,主进程不会立即显示回显。现在我提供了更多输入,导致循环重新启动。子进程的最后一次打印现在不可用吗?因为这没有发生。无论我提供了多少次输入或等待了多长时间,都没有发生任何事情。用答案编辑了问题。似乎种族条件真的是罪魁祸首。尽管我不知道为什么,但它现在起作用了。非常感谢大家:)