Имам приложение, написано на Qt C++, което ще събира информация за мрежовата връзка. Кодът за това е показан по-долу:
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+(?<vendor>.+)");
QRegularExpression re_product("GENERAL.PRODUCT:\\s+(?<product>.+)");
QRegularExpression re_hwaddr("GENERAL.HWADDR:\\s+(?<hwaddr>.+)");
QRegularExpression re_ip_gateway("ip = (?<ip>\\d+.\\d+.\\d+.\\d+)/\\d+, gw = (?<gateway>\\d+.\\d+.\\d+.\\d+)");
QRegularExpression re_ipmask("subnet_mask = (?<ipmask>\\d+.\\d+.\\d+.\\d+)");
QRegularExpression re_dhcp("dhcp_server_identifier = (?<dhcp>\\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(), когато приложението се стартира автоматично?