파생된 유형을 참조로 보내면 파생된 C++ 유형(예: opencv Mat 또는 기타 파생 유형)의 통신이 파이프를 통과한다는 것을 발견했습니다.
//Measurement FIFO while(1) { Mat xboxobs = some value; //changes in every iteration const char * obsfifo = "/tmp/obsfifo"; mkfifo(obsfifo, 0666); fm = open(obsfifo, O_WRONLY | O_NONBLOCK); write(fm, &xboxobs, 1024 ); close(fm); }
그리고 다음과 같이 독자의 참고 문헌을 읽으십시오.
while(1)
{
//READ kalman measurement fifo
const char * obsfifo = "/tmp/obsfifo";
fm = open(obsfifo, O_RDONLY );
Mat xboxobs;
read(fm, &obs, 1024 );
close(fm);
fflush(stdout);
}
unlink(obsfifo);
를 사용하거나 인쇄하여 Mat xboxobs
리더의 콘텐츠에 액세스 하려고 하면 오류가 발생합니다. 동일한 Linux 시스템에 리더와 라이터를 구현하고 있습니다.STDOUT
std::cout
printf
질문 1: 일반적으로 명명된 파이프를 통해 파생 유형을 안전하게 이동하는 것이 불가능합니까, 아니면 여기에 뭔가가 누락되어 있습니까?
질문 2Mat xboxobs
: 우회로, 행렬의 각 요소 와 다른 요소들을 명명된 파이프를 통해 부동소수점으로 보내고 Mats
있으며, 의 다양한 파이프를 통해 약 30개의 부동소수점과 통신해야 합니다 /tmp/somefifo
. 총 30개의 부동소수점을 보냈는데 그 중 15개는 동시에 실행되는 두 개의 별도 C++ 코드에서 나온 것이었고, 부동소수점을 수신자 코드의 매트릭스로 다시 집계했습니다.
좋은 점은 이것이 작동한다는 것입니다. 그러나 각 fifo에서 데이터를 읽는 것과 행렬로 다른 수학을 수행하기 전에 행렬 float 요소를 다시 행렬로 조립하는 사이의 읽기 시간(약 2~3초)이 매우 느립니다.
또한 작성기 코드에서 O_NONBLOCK을 사용하지 않는 경우 판독기를 구현할 때 프로그램이 정지된다는 사실도 발견했습니다. 디버깅은 gdb
나에게 특별한 것을 알려주지 않지만 디버깅 프로세스를 중지하면 다음과 같은 결과가 나타납니다.
../sysdeps/unix/syscall-template.S:81 81 ../sysdeps/unix/syscall-template.S의 __write_nocancel()에 있는 0x00007ffff68ba870: 해당 파일이나 디렉터리가 없습니다.
작성자 코드를 잠금 해제하지 않으면 왜 이 세 가지 프로그램을 안전하게 실행할 수 없는지 모르겠습니다. 전송하기 전에 매트릭스를 분할하면 수신자 코드가 왜 이렇게 느린가요? 이게 정상인가요?
어떤 도움이라도 감사하겠습니다.
답변1
read
그리고 write
인용하지 마세요.바늘. Prefix-&는 포인터를 반환하는 주소 지정 연산자입니다. 그것은접미사-&는 인용문을 의미합니다.
이런 식으로 데이터를 다른 프로그램에 전달할 수 있는일하지만오직다음과 같은 경우:
- 이 클래스는 포인터를 사용하지 않지만 클래스 자체 내부에 모든 것을 저장합니다.
- 두 프로그램 모두 동일한 C++ ABI(컴파일러 및 C++ 표준 라이브러리에 의해 정의됨)를 사용합니다.
- 클래스(및 클래스에서 사용하는 다른 클래스)의 정의는 두 프로그램 모두에서 동일합니다.
- 두 프로그램 모두 동일한 최적화 수준으로 컴파일러를 호출합니다.
그 중 하나에 해당되지 않는 경우 클래스에 있는 일부 데이터 요소의 오프셋이 달라질 가능성이 높으며 그러면 상황이 변경될 것입니다.번영. 운이 좋다면 그럴 수도 있다.모든겉보기에 무작위가 아닌 타이밍.
데이터를 다른 프로그램에 전달하는 더 좋은 방법은 직렬화 라이브러리를 사용하는 것입니다. 선택할 수 있는 것이 여러 가지 있습니다.강화에 포함됨