在NAO上分叉、执行和管道
Fork, execve and pipe on NAO
我目前正在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。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- C++,系统无法执行指定的程序
- 使用C++中的模板和运算符重载执行矩阵运算
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 执行函数时导致崩溃的变量
- IPC使用多个管道和分支进程来运行Python程序
- 外壳包装器句柄/执行交互式命令管道C++ UNIX
- 递归执行C 中的Linux管道命令
- 具有读写功能的 UNIX 管道系统可执行"ls -la"命令
- 如何使用 CreateProcess 或 ShellExecute 来执行管道命令
- 使用外部可执行文件作为管道的Qt 'way'是什么?
- popen 管道执行程序和读取输出的替代方法
- 执行控制台程序,写入标准输入并使用管道读取结果
- 在NAO上分叉、执行和管道
- 构建执行管道的c++库
- 如何执行和写入stdin并将stdout管道连接到套接字
- 如何在分叉和执行后使用带有选择的管道
- 系统/管道调用更改传递给执行的命令中的特殊字符
- c++遗传编程:调用链接器/编译器,执行编译后的程序和管道输入/输出