Azure Sphere 기본 API 개요
Azure Sphere 애플리케이션 런타임에는 상위 수준 애플리케이션 개발에 사용할 수 있는 기본 API인 POSIX 기반 C 표준 라이브러리, curl 기반 HTTP 클라이언트 라이브러리 및 Azure IoT C SDK 라이브러리를 정의하는 공용 라이브러리 세트가 포함되어 있습니다.
이 항목에서는 Azure Sphere에 포함된 기본 API를 결정하는 방법과 기본 API에 대한 참조 설명서를 찾을 수 있는 위치에 대해 설명합니다. 디바이스 관련 API에 대한 자세한 내용은 Applibs API를 참조하세요.
지원되지 않는 함수
Azure Sphere 애플리케이션 런타임의 API 화면에 명시적으로 포함된 기본 API 함수만 사용하는 것이 중요합니다. 지원되지 않는 함수를 호출하는 애플리케이션은 Azure Sphere OS의 향후 릴리스와 호환되지 않을 수 있으며 디바이스 불안정을 일으킬 수 있습니다. 추가 함수에 대한 지원을 요청하려면 Azure Sphere 커뮤니티 포럼을 사용하여 요청을 수행할 수 있습니다.
함수 확인
함수 호출이 지원되는지 여부를 확인하려면 Visual Studio에서 IntelliSense를 통해 자동 완성을 사용하거나 Azure Sphere SDK 헤더 파일에 포함되어 있는지 확인합니다. 각 라이브러리에 대한 헤더 파일의 위치는 아래 섹션에 나열되어 있습니다. 이러한 라이브러리에서 함수를 추가하거나 수정하는 경우 이 항목에 나열됩니다.
musl C 표준 라이브러리
Azure Sphere는 musl C 표준 라이브러리(musl libc)와 함께 제공됩니다. glibc와 마찬가지로 musl libc는 POSIX 규격 표준 C 라이브러리입니다. musl libc와 glibc 간의 기능적 차이는 musl libc wiki에 나열됩니다.
Azure Sphere 보안 정책 및 아키텍처와 일치하며, 모든 POSIX 함수가 노출되는 것은 아닙니다. 예를 들어 Azure Sphere는 open() 또는 fopen()함수를 지원하지 않습니다. 라이브러리의 지원되는 전체 API 표면은 Azure Sphere SDK 헤더 파일에 정의됩니다. 현재 구현은 향후 릴리스에서 변경될 수 있습니다.
API 참조: POSIX 사양
헤더 파일 위치: Azure Sphere SDK 설치 디렉터리의 Sysroots\API set\usr\include(Windows OS) 또는 Sysroots/API set/usr/include(Linux OS) 폴더.
팁
Sysroots\API set\usr\include\sys 폴더에는 하위 수준 시스템 종속 API에 대한 헤더가 들어 있는 반면 Sysroots\API set\usr\include 부모 폴더에는 일반 API에 대한 헤더가 포함되어 있습니다. Linux의 경우도 마찬가지입니다. 일반 API를 사용하는 것이 좋습니다.
C 표준 라이브러리 기능
C 표준 라이브러리 기능 중에서 제외된 중요한 부분은 다음과 같습니다.
- 파일 시스템 경로
- 터미널 지원
- 인증 및 권한 부여
- Syscall 함수
- SysV(System V)
fcntl
노출되고 사용할 수 있는 fcntl(int fd, int cmd, .../* arg */) 함수 CMD는 다음과 같습니다.
- F_GETFL - 파일 액세스 모드 및 관련 파일 상태 플래그를 검색합니다.
- F_SETFL - arg에서 설정한 대로 파일 설명자에 대한 파일 상태 플래그를 설정합니다.
- O_NONBLOCK - F_SETFL 위해 특별히 노출되는 인수입니다.
fcntl() 함수의 표준 사용법은 MUSL 라이브러리를 참조하세요.
C 형식 time_t
2038 년 UNIX Epoch 롤오버를 준비하기 위해 musl libc 버전 1.2 에는 32비트에서 64비트까지의 C 형식 time_t
및 모든 파생물 업데이트가 포함되었습니다. 이 업데이트에 대한 자세한 내용은 musl time64 릴리스 정보를 참조 하세요.
20.10 대상 API 집합(sysroot 7)에 대해 컴파일된 애플리케이션은 나중에 64비트 버전의 time_t
. 이전 버전의 Azure Sphere SDK 또는 대상 API 집합 20.04(sysroot 5) 이하를 사용하여 빌드된 애플리케이션은 time_t 32비트 정의를 계속 사용할 수 있습니다. 새 버전의 Azure Sphere OS는 이러한 애플리케이션에 동일한 ABI(애플리케이션 이진 인터페이스)를 계속 제공합니다.
값의 time_t
크기에 대해 가정하지 않는 애플리케이션 코드는 영향을 받지 않습니다. 그러나 값이 32비트(예time_t
: uint32_t 캐스팅)라고 명시적으로 또는 암시적으로 가정 time_t
하는 애플리케이션 코드는 64비트 버전을 반영하도록 다시 작성해야 합니다.
다음 코드 조각은 32비트 값이며 20.10 SDK(sysroot 7) 이상으로 다시 컴파일된 경우 버퍼 오버런이 발생한다고 가정 time_t
합니다.
// Incorrect code that assumes a 32-bit time_t value
time_t t = time(NULL);
char buffer[4];
memcpy(buffer, &t, sizeof(t)); // <-- buffer overrun when time_t is 64 bits
다음 수정된 코드는 버퍼가 값과 크기가 time_t
같도록 정의하므로 다음 크기에 time_t
대한 가정을 제거합니다.
// Corrected version of the code. It does not hard-code the size of time_t
time_t t; // time_t represents the 64-bit struct.
char buffer[sizeof(time_t)]; // Buffer size is based on the actual size of time_t
memcpy(buffer, &t, sizeof(t));
32비트 시간 값을 계속 사용해야 하는 경우 새 버전의 musl에서 형식을 사용합니다 time32_t
. 다음 코드 조각은 방법을 보여줍니다.
// Corrected version of the code for cases where 32-bit time_t is needed
time32_t t = /* ... initialize 32-bit value ... */;
char buffer[sizeof(time32_t)];
memcpy(buffer, &t, sizeof(t));
curl 라이브러리
Azure Sphere SDK에는 libcurl 다중 프로토콜 전송 라이브러리의 하위 집합이 포함되어 있습니다. 이 API를 사용하여 HTTP/HTTPS를 통해 데이터를 전송할 수 있습니다. 다른 전송 프로토콜은 지원되지 않습니다. 라이브러리의 지원되는 전체 API 표면은 Azure Sphere SDK 헤더 파일에 정의됩니다.
API 참조: libcurl 웹 사이트
헤더 파일 위치: Azure Sphere SDK 설치 디렉터리의 Sysroots\API set\usr\include\curl(Windows OS) 폴더 또는 Sysroots/API set/usr/include/curl(Linux OS) 폴더입니다.