2014-09-18 4 views
0

현재 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); 
} 
+0

왜 부모 프로세스에서'dup2'를'STDIN_FILENO' 하시겠습니까? 나는 당신이 예를 들어에서 무엇이든을 읽을 것으로 예상하지 않는다는 것을 확실하게 희망한다. 그 후'std :: cin'. 대신'pfd [0]'을 인자로하여'read'를 호출해야합니다. –

+0

dup2 (pfd [0], 0)가 없으면 문제는 동일하며 0의 반환 값은 0입니다. – PinkPR

+0

'read'가 0을 반환하면 파이프가 닫힙니다. 직감적으로'waitpid' 호출을'read' 호출 후에 *로 이동 시키려고 했습니까? (pipe descriptor는 * blocking *이므로 read 할 것이있을 때까지'read'가 블로킹됨을 기억하십시오.) –

답변

0

당신은 오히려 NAO에 프로세스를 생성하는 qi::os::spawnvp를 사용한다 : 여기

는 코드입니다. 그건 그렇고 크로스 플랫폼입니다. qi::os 함수는 NAOqi SDK에 제공된 <qi/os.hpp>을 직접 찾을 수 있으며 libqi에 직접 포함되어 있으며 NAO를 넘어서 매우 유용합니다.