我有一个用Qt C++编写的应用程序,它将收集关于网络连接的信息。 做到这一点的代码,如下所示:Linux C++:未登录时无法运行“nmcli dev dev list iface”
class NetworkHelper {
public:
static void networkInfo(const QString &device, QString &hwaddr, QString &hwdesc, QString &ip, QString &ipmask, QString &gateway, QString &dhcp)
{
FILE *fp;
char buf[512];
QRegularExpression re_vendor("GENERAL.VENDOR:\\s+(?.+)");
QRegularExpression re_product("GENERAL.PRODUCT:\\s+(?.+)");
QRegularExpression re_hwaddr("GENERAL.HWADDR:\\s+(?.+)");
QRegularExpression re_ip_gateway("ip = (?\\d+.\\d+.\\d+.\\d+)/\\d+, gw = (?\\d+.\\d+.\\d+.\\d+)");
QRegularExpression re_ipmask("subnet_mask = (?\\d+.\\d+.\\d+.\\d+)");
QRegularExpression re_dhcp("dhcp_server_identifier = (?\\d+.\\d+.\\d+.\\d+)");
QRegularExpressionMatch match;
hwaddr = QString();
hwdesc = QString();
ip = QString();
ipmask = QString();
gateway = QString();
dhcp = QString();
#ifdef Q_OS_LINUX
const char *cmd = QString("nmcli dev list iface %1").arg(device).toUtf8().constData();
if (!(fp = popen(cmd,"r")))
return;
while (fgets(buf, sizeof(buf), fp) != NULL)
{
match = re_ip_gateway.match(buf);
if (match.hasMatch())
{
ip = match.captured("ip");
gateway = match.captured("gateway");
}
match = re_ipmask.match(buf);
if (match.hasMatch())
ipmask = match.captured("ipmask");
match = re_dhcp.match(buf);
if (match.hasMatch())
dhcp = match.captured("dhcp");
match = re_vendor.match(buf);
if (match.hasMatch())
hwdesc = match.captured("vendor");
match = re_product.match(buf);
if (match.hasMatch())
hwdesc += hwdesc.isEmpty() ? match.captured("product") : "/"+match.captured("product");
match = re_hwaddr.match(buf);
if (match.hasMatch())
hwaddr = match.captured("hwaddr");
}
ret = pclose(fp);
#endif
}
};
应用为自动启动运行机启动后的权利。问题是popen()返回代码139,这对我的理解意味着segfault,while循环没有执行,所以我无法获取网络信息。
如果我登录并手动启动应用程序,上面的代码运行良好,我得到所有必需的网络信息。
此外 - 应用程序的另一部分启动一个HTTP服务器,我可以连接到应用程序作为自动启动运行时连接,所以似乎没有任何网络问题。
有谁知道,当应用程序自动启动时,我将如何运行popen()?
+0
NetworkManager的并不总是在开机时直接启动。您的自动启动脚本中是否有网络先决条件? –
+0
不,我不知道。所以这可能是问题?我正在使用Ubuntu。你有更多关于我的脚本需要的信息吗? –
+0
我试图在我的自动启动脚本中添加'sudo service network-manager start',但在这种情况下,我的http服务器无法启动,因此根本无法连接到应用程序。任何想法我如何继续? –