우리는 임베디드 Linux 시스템을 구현하고 있으며 시스템의 백그라운드 프로세스 데이터를 보여주는 실시간 업데이트 차트를 웹사이트에 제공해야 합니다.
문제는 다음과 같은 측면에서 데이터를 가장 잘 공유하는 방법입니다.
C로 작성된 새로운 값으로 링 버퍼를 주기적으로 업데이트하는 데이터 생성 절차입니다.
버퍼의 최신 내용을 얻어야 하는 웹 서버 CGI 기능입니다. 우리는 Python을 사용하여 CGI(nginx+wsgi+flask)를 구현합니다.
나는 현재 이를 위해 유닉스 소켓 솔루션 쪽으로 기울고 있지만, 백그라운드 프로세스가 간섭하지 않도록 하려면 C 프로그램의 멀티스레딩이 필요할 것이라고 생각합니다.
더 쉬운 방법이 있는지 궁금합니다. 버퍼 메모리를 가상 파일로 직접 매핑할 수 있나요? RAM 디스크에 있는 일반 파일을 버퍼로 사용하여 찾아서 쓰기만 하면 어떨까요?
답변1
파일 및 원자 이름 변경을 사용하는 간단한 솔루션은 스크립팅 언어를 사용하여 쉽게 구현할 수 있습니다.
보내는 사람
- 파일에 데이터 쓰기
A
- 파일 이름을
A
다음으로 바꿉니다.B
이름 바꾸기는 원자적으로 수행되며 수신자가 이전 파일을 처리하는 동안 수행될 수 있습니다.
수신자가 데이터를 읽지 않으면 발신자는 차단되지 않습니다.
수화기
동일한 데이터를 두 번 처리해도 문제가 없습니다.
- 파일을 열다
B
- 데이터 읽기
- 파일 닫기
이 옵션은 수신자가 여러 개인 경우에도 작동합니다(예: 웹 서버에 대한 여러 CGI 프로세스).
- 파일을 열다
수신자가 동일한 데이터를 두 번 처리해서는 안 되는 경우:
- 파일 이름을
B
다음으로 바꿉니다.C
- 성공하면 파일을 읽고 처리합니다.
C
- 선택적으로 파일 삭제
C
이 옵션은 단일 수신기에만 사용할 수 있습니다.
- 파일 이름을
두 경우 모두, 송신자가 수신자가 읽을 수 있는 것보다 더 빠르게 데이터를 쓰면 이전 데이터가 손실됩니다.
물론 다른 옵션도 있습니다.