Linux의 "time.h"에 "timer_t"가 정의되어 있지만 OS X이 아닌 이유


11

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 (우분투)를 켜고 linux c 표준 라이브러리 폴더 (폴더 경로는 OSX와 동일)에서 'time.h'를 열었습니다. 내가 예상했듯이 리눅스의 'time.h'파일에는 timer_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. 이 상황은 일반적으로 발생합니까? 다른 OS간에 다르게 정의 된 기능이나 특성이 있습니까?


유형 timer_t은 "리눅스에서만 정의"되지 않으며, 예를 들어 Windows / Cygwin에서도 정의됩니다. 헤더 파일 (Linux 및 Cygwin)의 정의에 따르면 POSIX 표준 유형 인 것 같습니다. (일부 플랫폼은 표준을 준수하지 않을 수 있다는 점 외에도 공식적으로 공식화 할 때 "일반적으로 발생하는"특정 상황이 보이지 않습니다.) 언어 라이브러리의 차이점에 대한 일반적인 질문. 벤더가 표준을 준수하는지 또는 어떤 버전을 준수하는지에 따라 다릅니다.
Janis

다음은 POSIX의 참조입니다. pubs.opengroup.org/onlinepubs/009695399/functions/…
teppic

@MarkPlotnick : 이것이 정답입니다
궤도의 가벼움 경주

@LightningRacisinObrit 나는 의견으로 (부분) 답변을 쓴 것을 후회합니다. 나는 그것을 제거했다.
Mark Plotnick

답변:


11

Unix와 C는 뉴저지의 Bell Labs에서 거의 비슷한시기에 개발되어 왔으며 C의 주요 목적 중 하나는 높은 수준의 아키텍처 독립적 인 휴대용 언어를 사용하여 Unix를 구현하는 것이 었습니다. 그러나 1983 년까지 공식적인 표준화는 없었습니다. POSIX , "휴대용 운영 체제 인터페이스"는 "Unix Wars" 시대로 거슬러 올라간 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)

__USE_POSIX199309때 features.h 설정되어 내부의 GLIBC 상징 _POSIX_C_SOURCE >= 199309LPOSIX.1b에가 (투시 지원된다는 것을 의미 feature_test_macros의 맨 페이지). 이 또한 지원됩니다 _XOPEN_SOURCE >= 600.

다른 OS간에 다르게 정의 된 기능이나 특성이 있습니까?

POSIX 시스템 중에서 C와 관련하여 그것을 피하려는 노력이 있다고 생각하지만 실제로는 발생합니다. sterror_r()POSIX 대응 서명이 호환되지 않는 GNU 확장 (예 :)이 있습니다. 아마도 이것은 POSIX가 확장 기능을 사용하지만이를 수정하거나 GNU가 꿈꾸는 대안 일 때 발생합니다 #define. 적절한을 사용하여 둘 중 하나를 선택할 수 있습니다 .


아주 좋아요! 이 얼마나 친절한 설명입니까!
casamia

1
POSIX와 C 표준은 부분적으로 C를 유닉스와 분리하는 것에 관한 것이 었습니다.이 두 가지는 너무 밀접하게 묶여서 때때로 어디로 갔는지 명확하지 않았습니다.
teppic

2

timer_tPOSIX의 timer_ API에서 사용됩니다 (예 :) timer_create(). POSIX의 UNIX 03 버전에서는 POSIX의 선택적 부분이며 macOS는이를 구현하지 않았습니다. 리눅스와 솔라리스 그리고 아마도 다른 UN * X도 마찬가지였다.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.