타사 응용 프로그램이 열려서는 안 되는 장치 노드를 여는 문제가 발생했습니다.
메시지 처리를 수행하는 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
이나 비슷한 것을 확인하십시오.아니요장치에 대한 노드를 만듭니다. )