2013-07-25 10 views
0

여러 프로세스가 동시에 실행되는 공유 라이브러리를 사용하고 싶습니다. 내 라이브러리에는 UART 열기/쓰기/읽기/닫기가 포함되어 있으며 각 프로세스는 특정 UART 명령을 작성하고 관련 응답을 기대합니다. 응용 프로그램은 LIB의 API를 호출하고 내부 API는 UART 포트를 열어 UART에 명령을 쓰고 UART에서 응답을 읽고 응답 버퍼를 처리 한 다음 사용자에게 다시 보냅니다 [API는 실행에 2 ~ 3 초가 걸립니다].여러 무관 한 프로세스 동기화 UART

이러한 API는 30 개이고이 API를 사용하여 5 개의 프로세스가 동시에 실행됩니다.

한 번에 하나의 프로세스 만 UART를 사용하고 다른 모든 블록은 UART를 사용하도록 이러한 모든 프로세스에서 동기화를 제공하려면 어떻게해야합니까?

감사합니다. & 감사합니다. Anil.

답변

1

여러 프로세스를 조정하는 방법에 대해 매우 일반적인 질문을하고 있습니다. 이것은 광대하고 깊은 주제이며, 당신이 취할 수있는 많은 경로가 있습니다. 다음은 몇 가지 아이디어입니다.

1) create a lock file in /var/lock. 직렬 포트를 사용하는 다른 프로그램에서도 작동합니다. 하나의 프로그램이 완료되면 다른 프로그램이 잠금 장치를 만들기 위해 경쟁하고 임의의 프로그램이 이길 것입니다.

2) 도서관에 shared memory segment을 작성하십시오. 공유 메모리 세그먼트에서 누가 '잠금'을 가지고 있는지 적어 두십시오. 잠금 파일과 마찬가지로 PID를 기록하여 소유자가 사망하면 다른 사람이 잠금을 훔칠 수 있습니다. 이것은 최소한의 오버 헤드를 갖는다.

3) 직렬 코드를 "UART 제어 데몬"과 데몬을 호출하는 클라이언트 라이브러리로 분할하십시오. 데몬은 유닉스 소켓 (또는 TCP/UDP 또는 다른 IPC)을 청취하고 직렬 포트만을 처리합니다. (모든 언어로 작성된 '채팅 서버'코드를 쉽게 찾을 수 있습니다.) 이것은 몇 가지 장점이 있습니다 :

  • 데몬은 "큐에"얼마나 많은 요청 발신자를 알 수
  • 데몬은 FIFO 순서를 유지하거나 원하는 경우 우선 순위 요청을 처리하기 위해 시도 할 수 있습니다.
  • 여러 클라이언트가 같은 질문을 한 번에 요청할 때 데몬이 응답을 캐시 할 수 있습니다.
  • 항상 데몬을 실행하지 않으려면 xinetd가 시작할 수 있습니다. (단일 서버 모드인지 확인하십시오.)
  • 각 프로세스를 직렬 라이브러리에 연결해야하는 대신에 더 간단한 표준 유닉스 소켓 (또는 TCP)을 사용합니다.
  • 귀하의 API 호출 프로그램이 호출 프로그램이 죽는 API가의 UART가 나쁜 상태로 남아 있지 않은 경우
  • (, 당신은 응답을 시뮬레이션 할 수있는 하드웨어가 필요)를 테스트하지 훨씬 쉽게 될