현재 Aldebaran의 NAO에서 프로그래밍 중이며 C++ 코드에서 셸 명령을 실행 한 다음 버퍼의 출력을 다시 얻어야합니다. 나는 fork, execve 및 pipe와 같은 고전적인 방법을 사용했지만 NAO 모듈에서 테스트 할 때 파이프가 작동하지 않습니다. 즉, 터미널에 작성된 명령의 출력은 없지만 부모 프로세스의 read()는 STDIN을 기다립니다.포크, execve 및 파이프 on NAO
정말 이상한 점은 파이프와 파이프를 테스트하기 위해 간단한 프로그램을 실행하면 똑같은 명령이 실행되어 파이프가 작동한다는 것입니다.
더 이상한 것은 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);
}
왜 부모 프로세스에서'dup2'를'STDIN_FILENO' 하시겠습니까? 나는 당신이 예를 들어에서 무엇이든을 읽을 것으로 예상하지 않는다는 것을 확실하게 희망한다. 그 후'std :: cin'. 대신'pfd [0]'을 인자로하여'read'를 호출해야합니다. –
dup2 (pfd [0], 0)가 없으면 문제는 동일하며 0의 반환 값은 0입니다. – PinkPR
'read'가 0을 반환하면 파이프가 닫힙니다. 직감적으로'waitpid' 호출을'read' 호출 후에 *로 이동 시키려고 했습니까? (pipe descriptor는 * blocking *이므로 read 할 것이있을 때까지'read'가 블로킹됨을 기억하십시오.) –