Вилка, execve и труба на НАО

0

В настоящее время я программирую Aldebaran NAO, и мне нужно выполнить команду оболочки из кода C++, а затем вернуть результат в буфер. Я использовал классический метод fork, execve и pipe, но точно, когда я тестирую его в модуле NAO, труба не работает. Я имею в виду, что нет вывода из команды, написанной на терминале, но мой read() в родительском процессе ждет STDIN.

Что действительно странно, так это то, что если я просто простую программу для проверки вилок и труб, с точно такой же командой, труба работает.

Еще более странно, что запись (1, "ЗДЕСЬ\n", 5) выполнена надлежащим образом, и сообщение отсканировано с помощью read();

Мой вывод на этом этапе заключается в том, что в модуле NAO C++ dup2() работает в дочернем процессе, но не на родительском.

Вы, ребята, знаете, что может быть?

Вот код:

void
Sonar::getResult()
{
  int pfd[2];
  char buf[4] = { 0, 0, 0, 0 };
  char *arg[] = { "/home/nao/picocom", "-b", "9600", "dev/ttyUSB0", 0 };
  int pid = 0;

  pipe(pfd);

  if ((pid = fork()) == 0)
  {
    close(pfd[0]);
    dup2(pfd[1], 1);

    write(1, "HERE\n", 5);
    int ret = execve(arg[0], arg, 0);

    if (ret == -1)
    {
      close(pfd[1]);
      write(1, "Fail.\n", 6);
      kill(getpid(), 15);
    }
  }

  std::cout << "Pid : " << pid << std::endl;

  close(pfd[1]);
  dup2(pfd[0], 0);
  waitpid(pid, 0, 0);
  int r = read(0, buf, 3);
  close(pfd[0]);

  std::cout << "Read : " << r << std::endl;

  printResult(buf);
}
  • 0
    Почему вы dup2 к STDIN_FILENO в родительском процессе? Я, конечно, надеюсь, что после этого вы ничего не ожидаете прочитать, например, из std::cin . Вместо этого вы должны вызвать read с pfd[0] качестве аргумента.
  • 0
    Проблема такая же без dup2 (pfd [0], 0), возвращаемое значение чтения равно 0.
Показать ещё 4 комментария
Теги:
pipe
nao-robot

1 ответ

0

Вы должны использовать qi :: os :: spawnvp для запуска процессов в NAO. Между прочим, это кросс-платформенный. Функции qi::os можно найти в include <qi/os.hpp> предусмотренном в SDK NAOqi, а также непосредственно в libqi и весьма полезны даже за пределами NAO.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню