장치 노드를 생성하지 않고 문자 장치 열기

장치 노드를 생성하지 않고 문자 장치 열기

타사 응용 프로그램이 열려서는 안 되는 장치 노드를 여는 문제가 있습니다.

메시지 처리를 수행하는 SPI 슬레이브 장치 드라이버를 작성했습니다. 드라이버가 특정 메시지에만 응답하는 "초기화 모드"로 로드되는 경우. 통신을 다시 초기화하려면 드라이버를 언로드했다가 다시 로드해야 합니다. 문제는 시스템에 모든 문자 장치를 여는 루트로 실행되는 타사 응용 프로그램이 있다는 것입니다. 이 모든 작업을 수행하는 유일한 방법은 앱을 중지하고 언로드하는 것입니다. 이는 전체 프로젝트에 큰 문제를 야기합니다.

실제로 장치 노드가 없어도 캐릭터 장치에 대한 연결을 열 수 있습니까? 지금은 fopen('/dev/spi')을 사용하고 있으며 다시 로드해야 하고 위의 문제가 발생할 때까지 모든 것이 잘 작동합니다. 실제 /dev/spi 파일 없이 특정 주/부 노드 번호에 대한 파일 설명자를 생성할 수 있는 시스템 호출이 있습니까?

답변1

문제가 있는 애플리케이션이 /dev트리 에서 장치 노드만 여는 경우그런 다음 자신의 프로그램에서 작동하는 경우 장치 노드를 다른 곳에 배치할 수 있습니다.

dev장치 노드가 있는 파일 시스템에는 장치 노드 파일을 특별하게 처리할 수 있도록 마운트 옵션이 설정되어 있어야 합니다 .

(면책조항: 저는 이것을 테스트하지는 않았지만 이전에도 비슷한 일을 해본 적이 있습니다...)

tmpfs예를 들어 작은 파일 시스템을 마운트 /my-dev/하고 거기에 장치 노드를 생성하는 것이 한 가지 예입니다.

mkdir -p /my-dev

mount -t tmpfs -o dev,size=<size> tmpfs /my-dev

mknod /my-dev/spi <type> <maj> <min>

어디<size>tmpfs의 크기입니다.<type>장치 노드 유형이고<maj> <min>메이저:마이너 장치 번호입니다. mount및 각각 에 대한 매뉴얼 페이지를 참조하십시오 mknod.

...그리고 fopen("/my-dev/spi")프로그램에서 사용하세요.

(그리고 물론, 그 udev또는 이와 유사한 것이 수행되는지 확인하십시오.~ 아니다장치에 대한 노드를 만듭니다.)

관련 정보