Linux에서는 "time.h"에 "timer_t"가 정의되어 있지만 OS X에서는 정의되어 있지 않은 이유

Linux에서는 "time.h"에 "timer_t"가 정의되어 있지만 OS X에서는 정의되어 있지 않은 이유

C 소스코드 파일을 읽다가 이런 문장을 발견했습니다. (이 소스코드는 리눅스 시스템 프로그램용으로 작성된 것이므로 매우 중요한 정보입니다.)

#include <time.h>
#include <stdio.h>

static timer_t* _interval_timer;
...

처음에는 "timer_t"에 대해 더 알고 싶었습니다. 그래서 헤더 정보를 얻기 위해 "time.h"를 검색했습니다. 그러나 "timer_t"에 대한 텍스트는 없고 "time_t"만 언급되어 있습니다.

호기심에 내 "mac" 컴퓨터에서 "time.h" c 표준 라이브러리 파일을 검색해서 열어봤습니다(아시다시피 /usr/include 폴더에는 c 표준 라이브러리 파일이 저장되어 있습니다.). 하지만 이 파일은 와 관련이 없습니다. Google에서 찾은 것과 동일한 파일입니다.

마지막으로 가상 머신을 사용하여 Linux OS(ubuntu)를 열고 Linux C 표준 라이브러리 폴더(폴더 경로는 OSX와 동일)에 있는 'time.h'를 열었습니다. 예상한 대로 Linux의 'time.h' 파일에는 타이머_t 선언이 있습니다.

아래에 "timer_t" 유형을 선언하는 코드 줄을 추가했습니다.

#if !defined __timer_t_defined && \
((defined _TIME_H && defined __USE_POSIX199309) || defined __need_timer_t)
# define __timer_t_defined      1

# include <bits/types.h>

/* Timer ID returned by `timer_create'.  */
typedef __timer_t timer_t;

내 문제는 이것이다.

  1. 왜 'timer_t'는 Linux C 표준 라이브러리에만 정의되어 있나요?

  2. 이게 흔한 일인가요? 즉, 운영 체제마다 다르게 정의된 기능이나 속성이 있습니까?

답변1

Unix와 C는 서로 얽힌 역사를 가지고 있습니다. 둘 다 뉴저지의 Bell Labs에서 같은 시기에 개발되었으며, C의 주요 목적 중 하나는 아키텍처에 독립적인 높은 수준의 이식 가능한 언어를 사용하여 Unix를 구현하는 것이었습니다. 그러나 1983년까지 공식적인 표준화가 이루어지지 않았습니다. POSIX, "휴대용 운영 체제 인터페이스"는 2007년부터 시작된 IEEE 운영 체제 표준입니다."유닉스 전쟁". 그 이후로 계속해서 발전해 왔으며 현재는 동종 표준 중 가장 널리 구현되는 표준이 되었습니다. OSX는 공식적으로 POSIX와 호환되는 반면 Linux는 비공식적으로 호환됩니다. Linux 배포판과 관련되지 않은 공식 준수와 관련된 물류 및 비용이 있습니다.

POSIX의 초점은 대부분 ISO C 외부의 콘텐츠를 정교화하는 데 있습니다. Time.h는 있지만 ISO 버전에는 timer_t이를 사용하는 유형이나 함수가 포함되어 있지 않습니다. 그 출신POSIX 확장이므로 Linux 헤더 파일에 다음과 같은 참조가 있습니다.

#if !defined __timer_t_defined && \
((defined _TIME_H && defined __USE_POSIX199309)

POSIX.1b에 대한 지원을 나타내는 __USE_POSIX199309feature.h에 설정된 내부 glibc 기호 입니다 (참조:_POSIX_C_SOURCE >= 199309L기능 테스트 매크로맨페이지). 이것 역시 지원됩니다 _XOPEN_SOURCE >= 600.

운영 체제마다 다르게 정의되는 기능이나 속성이 있습니까?

내 생각에 C를 사용하는 POSIX 시스템에서는 사람들이 이것을 피하려고 노력하고 있지만 실제로 그런 일이 발생합니다. sterror_r()POSIX 대응물과 호환되지 않는 서명을 가진 일부 GNU 확장(예: )이 있습니다 . 이는 POSIX가 확장을 사용했지만 이를 수정하거나 GNU Dream의 대안인 경우에 발생할 수 있습니다. 적절한 #define.

답변2

timer_tPOSIX의 timer_ API에서 사용됩니다. 예:timer_create(). POSIX의 UNIX 03 버전에서는 이는 POSIX의 선택적 부분이었으며 macOS에서는 구현되지 않았습니다. 이는 Linux와 Solaris 및 기타 일부 UN*X에도 해당됩니다.

따라서 보고 있는 코드는 Linux 및 Solaris에서는 작동할 수 있지만 Apple이 향후 타이머 API를 구현하지 않는 한 macOS에서는 작동하지 않을 수 있습니다. (이들은 현재 버전의 POSIX 사양의 일부이므로 Apple이 버전 3 대신 버전 4 사양을 준수하려면 이를 수행해야 합니다.)

관련 정보