簡體   English   中英

在NAO上進行分叉,執行和管道

[英]Fork, execve and pipe on NAO

我目前正在Aldebaran的NAO上編程,我需要從C ++代碼執行shell命令,然后在緩沖區中返回輸出。 我使用了fork,execve和pipe的經典方法,但是,恰好在NAO模塊中對其進行測試時,該管道不起作用。 我的意思是,終端中寫入的命令沒有輸出,但父進程中的read()等待STDIN。

真正奇怪的是,如果我只是執行一個簡單的程序來測試fork和pipe,並執行完全相同的命令,則該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, "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);
}

您應該使用qi :: os :: spawnvp在NAO上生成進程。 順便說一下,它是跨平台的。 qi::os函數可在NAOqi SDK中提供的include <qi/os.hpp>找到,該函數也直接在libqi中 ,並且甚至在NAO之外也非常有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM