linux 未登录 运行程序,Linux C++:未登录时无法运行“nmcli dev dev list iface”

我有一个用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服务器无法启动,因此根本无法连接到应用程序。任何想法我如何继续? –

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值