В настоящее время я программирую Aldebaran NAO, и мне нужно выполнить команду оболочки из кода C++, а затем вернуть результат в буфер. Я использовал классический метод fork, execve и pipe, но точно, когда я тестирую его в модуле NAO, труба не работает. Я имею в виду, что нет вывода из команды, написанной на терминале, но мой read() в родительском процессе ждет STDIN.
Что действительно странно, так это то, что если я просто простую программу для проверки вилок и труб, с точно такой же командой, труба работает.
Еще более странно, что запись (1, "ЗДЕСЬ\n", 5) выполнена надлежащим образом, и сообщение отсканировано с помощью read();
Мой вывод на этом этапе заключается в том, что в модуле NAO C++ 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
можно найти в include <qi/os.hpp>
предусмотренном в SDK NAOqi, а также непосредственно в libqi и весьма полезны даже за пределами NAO.
dup2
кSTDIN_FILENO
в родительском процессе? Я, конечно, надеюсь, что после этого вы ничего не ожидаете прочитать, например, изstd::cin
. Вместо этого вы должны вызватьread
сpfd[0]
качестве аргумента.