BlinCT
23 апреля 2019 г. 2:21

Чтение из стрима результата выполнения команды

C++11

Всем привет.
Пытаюсь найти способ (только не Си) как получить выхлоп какой нибуть консольной команды. Например fdisk -l или uname -a
ВРоде как в стандарте что то есть для выполнения команд и чтения из стрима, но чет не могу найти. Сишный способ нашел, ужасно...
Спасибо.

2

Вам это нравится? Поделитесь в социальных сетях!

5
Ruslan Polupan
  • 23 апреля 2019 г. 11:17
  • (ред.)

Я вот так ping выводил
Может там что и лишнее :-)

  1. void InfoObjectDialog::on_toolButtonPing_clicked()
  2. {
  3. QProcess *ping = new QProcess(this);
  4. if(pingOFF) {
  5. QModelIndex idx = ui->tableViewRro->selectionModel()->currentIndex();
  6. QString ip = modelPC->data(modelPC->index(idx.row(),1)).toString();
  7. QString pingMess = QString("PING "+modelPC->data(modelPC->index(idx.row(),0)).toString()+" IP: "+ip);
  8. ui->labelPingINFO->setText(pingMess);
  9. pingOFF=false;
  10. ui->pingOutput->clear();
  11. ui->pingOutput->show();
  12. ui->labelPingINFO->show();
  13. ping->setProcessChannelMode(QProcess::MergedChannels);
  14. connect( ping, SIGNAL(readyReadStandardOutput ()), this, SLOT(print_ping()) );
  15. #ifdef Q_OS_WIN
  16. ping->start("ping", QStringList() << "-t" <<ip);
  17. #else
  18. ping->start("ping", QStringList() <<ip);
  19. #endif
  20. } else {
  21. qDebug() << "Ping ID" << ping->pid();
  22. ping->terminate();
  23.  
  24. ping->kill(ping->pid(), SIGINT);
  25. QProcess::execute(QString("kill -SIGINT %1").arg(ping->processId()));
  26. QProcess::execute(QString("taskkill /PID %1 /F").arg(ping->processId()));
  27.  
  28. #ifdef Q_OS_WIN
  29. PROCESS_INFORMATION *pinfo = (PROCESS_INFORMATION *)ping->pid();
  30. QProcess::execute(QString("taskkill /PID %1 /F").arg(pinfo->dwProcessId));
  31. #else
  32. QProcess::execute(QString("kill -SIGINT %1").arg(ping->pid()));
  33. #endif
  34. pingOFF=true;
  35. ui->pingOutput->hide();
  36. ui->pingOutput->clear();
  37. ui->labelPingINFO->hide();
  38.  
  39. }
  40.  
  41. }
    BlinCT
    • 23 апреля 2019 г. 23:07

    Как я вижу вы изпользовали Qt методы. Из стандарта ничего не заюзали.
    В принципе тоже вариант. МНе главное передать консольную каманду и перехватить весь стрим. Обработка того что получаю это уже другое дело)

      BlinCT
      • 24 апреля 2019 г. 0:04
      • Ответ был помечен как решение.

      В общем попробовал я чет такое

      1. QProcess process;
      2.  
      3. QString lsblkMess;
      4. QString lsblkError;
      5. QByteArray byteArray;
      6.  
      7. process.start("lsblk");
      8.  
      9. if (process.waitForStarted(-1))
      10. {
      11. while(process.waitForReadyRead(-1))
      12. {
      13. byteArray = process.readAllStandardOutput();
      14. lsblkMess += byteArray.data();
      15. }
      16. }

      и чет как то не проходит. массив данных пустой(

        BlinCT
        • 24 апреля 2019 г. 0:39

        Вопрос закрыт) проблема найдена

          Ruslan Polupan
          • 24 апреля 2019 г. 12:20

          я так понимаю надо инфорация об устройствах.
          Я бы пробовал так

          1. rust@suse:~> lsblk -P
          2. NAME="sda" MAJ:MIN="8:0" RM="0" SIZE="111,8G" RO="0" TYPE="disk" MOUNTPOINT=""
          3. NAME="sda1" MAJ:MIN="8:1" RM="0" SIZE="111,8G" RO="0" TYPE="part" MOUNTPOINT="/boot/grub2/i386-pc"
          4. NAME="sdb" MAJ:MIN="8:16" RM="0" SIZE="465,8G" RO="0" TYPE="disk" MOUNTPOINT=""
          5. NAME="sdb1" MAJ:MIN="8:17" RM="0" SIZE="8M" RO="0" TYPE="part" MOUNTPOINT=""
          6. NAME="sdb2" MAJ:MIN="8:18" RM="0" SIZE="462G" RO="0" TYPE="part" MOUNTPOINT="/home"
          7. NAME="sdb3" MAJ:MIN="8:19" RM="0" SIZE="3,8G" RO="0" TYPE="part" MOUNTPOINT="[SWAP]"
          8.  

          и парсил бы вывод по строчно записывая в свой тип данных или модель

            Комментарии

            Только авторизованные пользователи могут публиковать комментарии.
            Пожалуйста, авторизуйтесь или зарегистрируйтесь