在NAO上分叉、执行和管道

Fork, execve and pipe on NAO

本文关键字:执行 管道 分叉 NAO      更新时间:2023-10-16

我目前正在Aldebaran的NAO上编程,我需要从C++代码中执行一个shell命令,然后在缓冲区中返回输出。我使用了fork、execve和pipe的经典方法,但正是当我在NAO模块中测试它时,pipe不起作用。我的意思是,终端中写入的命令没有输出,但父进程中的read()等待STDIN。

真正奇怪的是,如果我只做一个简单的程序来测试fork和pipes,执行完全相同的命令,pipe就会工作。

更奇怪的是,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, "HEREn", 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);
}

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