[英]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.