0

現在、アルデバランの NAO でプログラミングを行っています。C++ コードからシェル コマンドを実行し、出力をバッファに戻す必要があります。fork、execve、pipe という古典的な方法を使用しましたが、正確に NAO モジュールでテストすると、パイプが機能しません。つまり、ターミナルに書き込まれたコマンドからの出力はありませんが、親プロセスの read() は STDIN で待機しています。

本当に奇妙なのは、フォークとパイプをテストする単純なプログラムを実行し、まったく同じコマンドを実行すると、パイプが機能することです。

さらに奇妙なのは、 write(1, "HERE\n", 5) が適切に実行され、メッセージが read(); によってキャッチバックされることです。

この時点での私の結論は、C++ NAO モジュールでは、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);
}
4

1 に答える 1

0

NAO でプロセスを生成するには、むしろqi::os::spawnvpを使用する必要があります。ちなみにクロスプラットフォームです。qi::os関数は<qi/os.hpp>、NAOqi SDK で提供されるインクルードにあり、直接libqiにもあり、NAO を超えても非常に便利です。

于 2017-08-18T10:10:26.080 に答える