Вилка, execve и труба на НАО

В настоящее время я программирую на NAO в Aldebaran, и мне нужно выполнить команду оболочки из кода C ++, а затем вернуть результат в буфер. Я использовал классический метод fork, execve и pipe, но именно тогда, когда я тестирую его в модуле NAO, pipe не работает. Я имею в виду, что нет выходных данных команды, написанной в терминале, но мой read () в родительском процессе ожидает STDIN.

Что действительно странно, так это то, что если я просто делаю простую программу для проверки вилок и каналов с точно такой же выполненной командой, канал работает.

Еще более странным является то, что запись (1, «ЗДЕСЬ \ 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);
}

0

Решение

Вы должны скорее использовать Ци :: ОС :: spawnvp порождать процессы на НАО. Кстати, кроссплатформенный. qi::os функции можно найти во включении <qi/os.hpp> предоставляется в NAOqi SDK а также непосредственно в libqi, и весьма полезны, даже за пределами NAO.

0

Другие решения


По вопросам рекламы [email protected]