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 등을 전송하지 않는 한 계속 유지할 수있는 아이디어가 있습니까?
도움 주셔서 감사합니다.
사실 나는 그것을 _asynchronously_로 실행하고 싶습니다. 자식 프로세스에 __SIGUSR1__ 신호를 보내어 산발적으로 동기화합니다. 내가 원하는 것은 스레드와 같이 비동기 적으로 실행되는 자식 프로세스입니다 (그러나 다른 프로세스 임). 어떤 식 으로든 ... 내 컴퓨터에 액세스 할 때'boost :: process :: system'을 시도 할 것입니다. –
자식 프로세스가 비동기로 예상되는 경우 문제가 무엇인지 이해하지 못하기 때문에 답변을 연장했습니다. –
문제는 'raspiyuv ... -t 0 -s ...'를 실행하면 SIGUSR1이 실제 이미지 캡처를 기다리는 동안 (영원히) 유휴 상태로 앱을 시작해야한다는 것입니다. 그러면 다음 SIGUSR1_을 기다리는 대기 상태로 돌아갑니다. 코드 0으로 바로 반환하면 안됩니다. –