Linux C++: не може да стартира nmcli dev list iface, когато не сте влезли

Имам приложение, написано на 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(), когато приложението се стартира автоматично?


person Jon Helt-Hansen    schedule 16.06.2014    source източник
comment
NetworkManager не винаги се стартира директно по време на зареждане. Имате ли предпоставка за мрежа във вашия скрипт за автоматично стартиране?   -  person andrjas    schedule 16.06.2014
comment
Не, не го правя. Значи това може да е проблемът? Използвам Ubuntu. Имате ли повече информация за това какво ще ми трябва в моя сценарий?   -  person Jon Helt-Hansen    schedule 16.06.2014
comment
Опитах се да добавя 'sudo service network-manager start' към моя скрипт за автоматично стартиране, но в този случай моят http сървър не стартира и следователно изобщо не мога да се свържа с приложението. Някакви идеи как да продължа?   -  person Jon Helt-Hansen    schedule 18.06.2014
comment
Може ли някой да ми подскаже какво трябва да добавя към моя austostart скрипт, за да се уверя, че NetworkManager е стартиран?   -  person Jon Helt-Hansen    schedule 19.06.2014
comment
само да поясня. Ако приложението ми работи във фонов режим и вляза в машината или направя ssh, тогава popen(nmcli dev list iface eth0, r) работи добре и дава код за връщане 0. Ако изляза или прекратя ssh сесията, тогава Командата popen() не работи и дава код за връщане 139.   -  person Jon Helt-Hansen    schedule 19.06.2014


Отговори (1)


Открих, че приложението ми се стартира преди мрежовия мениджър (или нещо подобно - не съм напълно сигурен защо видях горното поведение, тъй като успях да се свържа с http сървъра, стартиран от приложението, но не можах да изпълня командата nmcli).

В моя скрипт за автоматично стартиране добавих условието да не стартирам приложението, преди да е установена онлайн връзка, което реши проблема ми

person Jon Helt-Hansen    schedule 30.06.2014