0

我目前正在 Aldebaran 的 NAO 上编程,我需要从 C++ 代码执行 shell 命令,然后在缓冲区中取回输出。我使用了经典的 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

您应该使用qi::os::spawnvp在 NAO 上生成进程。顺便说一句,它是跨平台的。qi::os功能可以<qi/os.hpp>在 NAOqi SDK 提供的 include 中找到,也可以直接在libqi中找到,并且非常有用,甚至超出了 NAO。

于 2017-08-18T10:10:26.080 回答