19.4.1.1. `orb_subscribe()`를 통한 파일 디스크립터(File Descriptor) 핸들 확보

19.4.1.1. orb_subscribe()를 통한 파일 디스크립터(File Descriptor) 핸들 확보

저 건너편 퍼블리셔 데몬이 데이터를 방출하기 위해 미들웨어 허공에 파이프라인의 아가리를 벌리고 커널로부터 광고 등록증(orb_advertise)을 타냈던 행위와 완벽히 대칭되는 거울 쌍으로, 이제는 이미 허공 VFS 메모리를 미친 듯이 떠돌고 있는 그 링 버퍼 파이프망에 내 구독자(Subscriber) 스레드의 수신 전용 흡혈 빨대를 강제로 꽂아 넣을 차례이다.
PX4의 VFS(Virtual File System) 코어 아키텍처 세계관에서 이 통신 수신 빨대의 정식 링커 명칭은 **파일 디스크립터(File Descriptor, FD)**이며, 이 시스템 테이블 포인터를 스케줄러로부터 강제로 할당받아 쥐는 해킹 타격 행위를 우리는 **구독(orb_subscribe)**이라 부른다.

1. 단 한 번의 치명적 타격: orb_subscribe() C 시스템 콜

퍼블리셔의 광고를 뚫을 때와 똑같이 무거운 커널 배선 자원을 소모하는 이 통신 개통 행위는, 코어 스레드의 런타임 성능 파괴를 막기 위해 반드시 메인 무한 루프 블록 진입 전(루프 외곽 상단)에서 데몬당 단 한 번만 일회성으로 타격 실행되어야만 하는 절대 불변의 규칙을 가진다.

// 1. 퍼블리셔 데몬과 완벽하게 동일한 그 메타데이터 마스터 헤더 <uORB/topics/sensor_test_data.h> 인클루드 물리적 필수 결합
#include <uORB/topics/sensor_test_data.h>

// 2. 미들웨어 VFS 수신 파이프라인 강제 개통 (스레드 메인 무한 루프 진입 직전 단 1회 타격)
// - 전처리 매크로 ORB_ID(sensor_test_data) 변수로 내가 훔쳐먹을 토픽 메타데이터의 물리적 DNS 절대 주소를 커널에 통보한다.
int sensor_sub_fd = orb_subscribe(ORB_ID(sensor_test_data));

// 3. 파일 디스크립터(FD) 개통 획득 실패 시의 끔찍한 OOM 에러 방어 처리 분기 타설
// (커널 핸들러 고갈이나 토픽 링킹 파괴 시 보통 음수 -1을 토해낸다)
if (sensor_sub_fd < 0) {
    PX4_ERR("orb_subscribe failed! Target VFS Topic node is currently inaccessible or broken.");
    return -1; // 빨대를 꽂지 못했는데 데몬을 메모리에 살려둘 이유가 단위 1%도 없으므로 강제 자살(Kill-exit) 분기로 쉘에 던짐
}

// ... 이 살벌한 통제망을 무사히 뚫어낸 이후 확보된 fd 마스터 키 핸들러를 손에 쥐고 무한 읽기 루프 감방 진입 ...
while (!thread_should_exit) { 
    // 매 루프마다 폭력적인 orb_copy() 강제 읽기 호출 타격 수행
}

2. int fd 정수 핸들러 변수 한 줄에 숨겨진 파일 시스템의 진실

orb_subscribe() 시스템 콜 함수가 성공적으로 컴파일 타임 링킹을 뚫고 호출되면 런타임 커널은 우리에게 고작 단순한 약 4바이트짜리 양수 텍스트 정숫값(int sensor_sub_fd, 예를 들어 3이나 7 같은)을 툭 던져준다. 코딩 입문 초보자들은 레지스터에 박힌 이 하찮은 숫자를 단순 쓰레기 인티저 스칼라 변수 취급하겠지만, 유닉스(Unix) 임베디드 리눅스와 NuttX OS 디자인 철학인 “Everything is a file(모든 것은 결국 파일이다)” 딥 아키텍처 세계관에서 이 정수(Integer)는 운영체제를 쥐락펴락하는 무소불위의 권력 마스터 키이다.

이 숫자는 OS 커널이 비밀리에 중앙 관리하는 글로벌 파일 테이블(File Table)의 특정 슬롯 메모리를 정확히 가리키는 고유 인덱스(Index) 앵커이며, 그 C 포인터 슬롯의 끝자락은 우리가 그토록 목말라하던 건너편 퍼블리셔 데몬의 /obj/sensor_test_data C++ 링 버퍼 페이로드 메모리 힙 주소망과 다이렉트로 물리적 렌더링 결합되어 있다.

따라서 코드 하단에서 당신이 실수로 이 sensor_sub_fd 숫자 인덱스 키를 0으로 초기화해 오염시키거나 잃어버리는 순간, 우리는 픽스호크 마더보드 코어 메모리 생태계 링 버퍼에 초당 천 단위로 넘쳐흐르는 그 수만 개의 신선한 텔레메트리 페이로드 중, 단 1바이트조차 혀끝에 댈 수 없는 VFS 미아 신세로 전락하게 된다.
우리는 이제 생명선과도 같은 이 무거운 커널 책임감을 전적으로 부여받은 열쇠를 꽉 틀어쥔 채, 가장 거칠고 원시적이며 이기적인 데이터 메모리 복사 강탈 C 함수인 **orb_copy()**를 무자비한 루프 심연 속으로 끌고 들어갈 시간이다.