QProcess 有时会返回空字符串

问题描述

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

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

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

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

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

来自我的应用程序的代码

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 $1 }";

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

知道这可能是什么原因吗?是否有任何解决方案可以不获取此空字符串?

编辑:

  • 使用的 Qt 版本:5.4.1

  • 设备:Mac Book Air (macOS)

解决方法

我发现问题发生是因为 macOS 中的机场管理员已经在忙于其他操作(例如扫描)。

发生这种情况的原因可能有:

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

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