2017-10-11 8 views
0

C++의 Raspberry Pi/Raspbian에서 응용 프로그램을 코딩하고 있습니다. mkfifo()으로 명명 된 파이프 (FIFO)를 만든 다음 raspiyuv을 시작하여 카메라에서 이미지를 가져옵니다. 메모리의 경우 raspiyuv은 스틸 이미지를 YUV 파일로 저장하는 라즈베리 파이 명령 줄 응용 프로그램입니다.C++ 응용 프로그램에서 Raspberry Pi 카메라 응용 프로그램을 자식 프로세스로 올바르게 생성 할 수 없습니다.

저는 g ++ 6.3과 부스트 1.64를 -std = C++ 17으로 사용하고 있습니다. 내가 만드는 FIFO는 커맨드 라인에서 사용할 수 있다는 의미에서 정확합니다. 그것은 예상대로 작동합니다.

버그는 응용 프로그램 raspiyuv 내가 종료 코드 0 즉시 반환를 생성한다는 것이다.

내 코드 : 나는 명령 줄에 직접 입력 할 때

void myFunction() 
{ 
    // Create the FIFO here with mkfifo(); // Works fine... 
    boost::filesystem::path lExecPath = 
     boost::process::search_path("raspiyuv"); // returns correct path 
    boost::process::child lProcess(lExecPath, "-w 2592 -h 1944 -o - -t 0 -y -s >> /var/tmp/myfifo"); 
    int lPID = lProcess.id(); // Seems to be correct 
    int lExitCode = lProcess.exit_code(); // Returns immediately with 0 
} 

명령 $ raspiyuv -w 2592 -h 1944 -o - -t 0 -y -s 올바른 것입니다. 또한 FIFO 로의 리디렉션이 올바르게 작동합니다. -w 2592 -h 1944 잡힌 이미지의 크기를 지정하면 -o -은 출력 이미지를 표준 출력으로, -t 0은 영원히 기다림을 의미하고 -y은 Y 채널 만 저장하고 -s은 이미지 캡처를 트리거 할 때까지 기다리는 것을 의미합니다.

명령 줄에서 호출하면 SIGUSR1을 보낼 때까지 응용 프로그램이 유휴 상태가되고 이미지를 캡처 한 다음 FIFO로 스트림 한 다음 유휴 상태를 반환합니다. 괜찮아.

boost::process::child 개체를 생성하여 스폰하면 즉시 반환됩니다.

이 문제를 해결하고 boost::process::child이 내 응용 프로그램 (상위 프로세스)이 살아 있고 SIGKILL 등을 전송하지 않는 한 계속 유지할 수있는 아이디어가 있습니까?

도움 주셔서 감사합니다.

답변

0

boost::process::child은 주 프로세스와 비동기 적으로 실행됩니다. 동기식 동작을 원할 경우를 입력하거나 boost::process::system과 같은 동기식 방법으로 해당 raspiyuv를 실행해야합니다.

편집 : 당신은 (편집과 댓글 표시하는 것 같은) 다른 프로세스는 다음 당신이 정말로하려고하는 것은 나에게 분명하게 비동기하려면 :

버그가 있다는 것입니다 내가 응용 프로그램 raspiyuv 종료 코드 0 즉시 반환합니다.

어떤 버그입니까? docs of boost::process::child까지 그것은이다 예상된다 정확히 :

  1. INT의 exit_code()을 const; exit_code를 가져옵니다. 반환 값은 자식이 대기하지 않았거나 종료 된 경우 어떤 의미도없이 이 아닙니다.

코드는 아무 것도 끝내기를 기다리지 않으므로 종료 코드가 문서화됩니다.

+0

사실 나는 그것을 _asynchronously_로 실행하고 싶습니다. 자식 프로세스에 __SIGUSR1__ 신호를 보내어 산발적으로 동기화합니다. 내가 원하는 것은 스레드와 같이 비동기 적으로 실행되는 자식 프로세스입니다 (그러나 다른 프로세스 임). 어떤 식 으로든 ... 내 컴퓨터에 액세스 할 때'boost :: process :: system'을 시도 할 것입니다. –

+0

자식 프로세스가 비동기로 예상되는 경우 문제가 무엇인지 이해하지 못하기 때문에 답변을 연장했습니다. –

+0

문제는 'raspiyuv ... -t 0 -s ...'를 실행하면 SIGUSR1이 실제 이미지 캡처를 기다리는 동안 (영원히) 유휴 상태로 앱을 시작해야한다는 것입니다. 그러면 다음 SIGUSR1_을 기다리는 대기 상태로 돌아갑니다. 코드 0으로 바로 반환하면 안됩니다. –