2011-08-09 3 views
1

간단한 C++ 도구를 Ada에 포팅하여 Linux에서 Ada를 배우려고합니다.Ada IO Multiplexing on Linux

지금 나는 모뎀 명령을 보내고 선택 호출을 사용하여 신호 화 된 파일 설명자를 기다리는 간단한 직렬 통신 프로그램을 작성하려고합니다.

select 호출을 포함하는 패키지를 찾을 수없는 것 같습니다. 플랫폼 특정 패키지를 여기에서 찾아야합니까? 이걸 어디서 발견 할 수 있니? 나는 심지어 여기서 옳은 것을 찾고 있는가?

+0

답변은 대화식 인터페이스의 특성에 달려 있다고 생각합니다. TCP/IP 소켓의 경우 GNAT.Sockets는 필요한 것을 제공합니다 (컴파일러에 따라 다름). 직렬 포트의 특성을 알기 전까지는 신호 처리 된 파일 설명자가 무엇이 필요한지 말할 수 없습니다. –

+0

나는 모뎀 명령을 보내고 해당 filedescriptor에 대한 응답을 기다리고있다. 하지만 T.E.D. 아래에서 언급하십시오. 아마도 이것을 포기하고 과제를 조사하는 것이 좋습니다. 나는 그것을 "에이다"방식으로하고 싶지만 어디를보아야하는지 전혀 몰랐다. – zeroc8

답변

1

select()은 Unix 고유의 OS 호출이므로 Ada의 표준 라이브러리에 속하지 않습니다.

유닉스 시스템 호출 인터페이스를 제공하는 (비표준) 패키지를 찾고, 인터프리싱 프라그 마를 사용하여 직접 포장하거나, 다른 접근법을 취할 필요가 있습니다.

첫 번째 옵션으로는 유닉스 시스템을 사용하지 않아 조금만 도움이 될 수 있습니다. Posix 패키지 이어야하며, package (Florist) for Gnat here과 같은 패키지를 찾을 수 있습니다. 나는 그 품질에 대해 말할 수 없다.

자신 만의 바인딩을 만들려면 Appendix B of the LRM에 제공된 기능을 확인하십시오. 이것은 고급 주제의 일종이지만 OS가 어떻게 서브 루틴 연계를하는지 또는 배울 준비가되어 있지 않다면 시도해서는 안됩니다.

"다른 접근법"을 사용하려면 Ada의 작업 및/또는 보호 된 개체 (C++의 protected 키워드와 혼동되어서는 안 됨)에 대해 사용중인 참조 가이드를 살펴보십시오. 예를 들어 직렬 포트에서 들어오는 데이터를 읽는 것이 하나의 작업 인 것을 선호 할 수 있습니다. 랑데뷰를 통해 읽기 사이에서 동기화하거나 보호 된 객체를 통해 구현 된 대기열을 사용하여 정말 섹시해질 수 있습니다.

+0

감사합니다. 두 번째 접근 방식을 살펴보고 더 많은 Ada'ish처럼 보입니다. – zeroc8

+0

글쎄, 낮은 수준의 OS 인터페이스를 사용하여 작업을 수행한다면, 많은 추악한 Ada와 유사한 코드로 끝날 것입니다. 플로리스트가 얼마나 낮은 지 모르겠습니다. OTOH, Ada는 낮은 수준의 시스템 프로그래밍 언어로 사용할 수 있습니다. –

+0

이 [Q & A] (http://stackoverflow.com/questions/6928285/how-to-bind-to-opencv-for-gnat)도 참조하십시오. – trashgod