QProcess 有时会返回空字符串

QProcess sometimes returning empty string

我最近一直在尝试在我的程序中创建一个扫描无线网络的功能。基本上有一个“扫描”按钮,使用时会触发此功能。

这个函数非常简单,它只是实例化一个 QProcess,它打开一个 shell 并执行以下来自 macOS X 的本机命令:

/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport  -s | awk -F\" \" '{ print  }

这让我可以扫描附近的无线网络并过滤结果以仅显示其 SSID 列表。

出现问题是因为当我使用我的 Qt 函数时,它 returns 给我正确的 SSID,但在大多数情况下,当我再次按下按钮时,返回的列表是空的。尝试调试应用程序时,我看到 QProcess 命令 returns 是一个空字符串。

来自我的应用程序的代码:

QStringList WifiConnection::scan_macOS()
{
    QProcess* myProcess = new QProcess( this );
    QString airport = "/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport";
    QString command = " -s | awk -F\" \" '{ print  }";

    qDebug() << "Opening shell.";
    myProcess->start("sh");
    qDebug() << "Executing command: " << airport << command;
    myProcess->write(airport + command);
    myProcess->closeWriteChannel();
    myProcess->waitForFinished();
    QString info = myProcess->readAllStandardOutput();
}

知道这可能是什么原因吗,是否有任何解决方案来避免这个空字符串?

编辑:

我发现问题的发生是因为 macOS 中的机场经理已经忙于另一项操作(例如扫描)。

这可能由于某些原因而发生:

  • 另一个应用程序正在控制机场应用程序。
  • 使用 QNetworkConfigurationManager 每 10 秒执行一次自动无线扫描。
  • 您的笔记本电脑启用了定位功能,在某些 OS 版本中会导致定期扫描。

我为避免得到空答案所做的是按照@markus-nm 在评论中的建议添加 myProcess->waitForFinished();,并确保结果不为空 if (!info.isEmpty())