लिनक्स पर "time.h" में "टाइमर_t" क्यों परिभाषित किया गया है, लेकिन ओएस एक्स नहीं


11

जब मैं एक सी स्रोत कोड फ़ाइलों को पढ़ रहा था, तो मुझे यह घोषणाएं मिलीं। (यह स्रोत कोड लिनक्स सिस्टम प्रोग्राम के लिए लिखा गया था। यह बहुत महत्वपूर्ण जानकारी है)

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

static timer_t* _interval_timer;
...

पहले, मैं 'टाइमर_टी' के बारे में अधिक जानना चाहता था। इसलिए मैंने हेडर की जानकारी प्राप्त करने के लिए 'time.h' को देखा। लेकिन, 'टाइमर_टी' के बारे में कोई शब्द नहीं था, केवल 'time_t' के बारे में उल्लेख कर रहा था।

जिज्ञासा में, मैंने अपने 'मैक' कंप्यूटर में 'time.h' c मानक लाइब्रेरी फ़ाइल खोजी और खोली (जैसा कि आप जानते हैं, / usr / फ़ोल्डर शामिल हैं c मानक लाइब्रेरी फ़ाइलें।) लेकिन यह फ़ाइल पिछले googled एक के साथ समान थी।

अंत में, मैंने वर्चुअल मशीन का उपयोग करके अपने linux os (ubuntu) को चालू किया और linux c मानक लाइब्रेरी फ़ोल्डर में 'time.h' का विरोध किया (फ़ोल्डर पथ OSX के समान है)। जैसा कि मुझे उम्मीद थी, linux में 'time.h' फ़ाइल में टाइमर_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. क्यों 'टाइमर_टी' को केवल लिनक्स सी मानक पुस्तकालय में परिभाषित किया गया है?

  2. क्या यह स्थिति आमतौर पर होती है? मेरा मतलब है, क्या अलग-अलग ओएस के बीच कोई अलग-अलग परिभाषित कार्य या विशेषताएं हैं?


प्रकार timer_t"केवल लिनक्स में परिभाषित नहीं है", उदाहरण के लिए विंडोज / सिगविन पर भी इसे परिभाषित किया गया है। हेडर फ़ाइलों (लिनक्स और सिगविन) में परिभाषाओं के अनुसार यह एक पॉसिक्स मानक प्रकार लगता है। (इससे परे कि कुछ प्लेटफ़ॉर्म मानकों के अनुरूप नहीं हो सकते हैं, मुझे कोई भी विशिष्ट स्थिति नहीं दिखती है जो "आमतौर पर होता है", जैसा कि आपने इसे तैयार किया है।) भाषा पुस्तकालयों में अंतर के बारे में आपके सामान्य प्रश्न को गलत ठहराएं; यह इस बात पर निर्भर करता है कि विक्रेता मानकों का अनुपालन करते हैं या वे किन संस्करणों का अनुपालन करते हैं।
Janis

यहाँ POSIX से एक संदर्भ है: pubs.opengroup.org/onlinepubs/009695399/functions/…
teppic

@MarkPlotnick: इसका जवाब है
दौड़ ऑर्बिट में

@LightningRacisinObrit मुझे खेद है कि मैंने टिप्पणी के रूप में (आंशिक) उत्तर लिखा है। मैंने इसे हटा दिया है।
मार्क प्लॉटनिक

जवाबों:


11

यूनिक्स और सी का एक अंतःनिर्मित इतिहास है, क्योंकि वे दोनों एक ही समय में न्यू जर्सी के बेल लैब्स में विकसित हुए थे और सी का एक प्रमुख उद्देश्य यूनिक्स को उच्च स्तर, वास्तुकला स्वतंत्र, पोर्टेबल भाषा का उपयोग करके लागू करना था। हालाँकि, 1983 तक कोई आधिकारिक मानकीकरण नहीं था। POSIX , "पोर्टेबल ऑपरेटिंग सिस्टम इंटरफ़ेस" एक IEEE ऑपरेटिंग सिस्टम मानक है, जो "यूनिक्स युद्धों" के समय में वापस आता है । यह तब से विकसित हो रहा है और अब इस तरह के मानक को सबसे व्यापक रूप से लागू किया गया है। OSX आधिकारिक तौर पर POSIX अनुपालन है, और अनधिकृत रूप से लिनक्स है - आधिकारिक अनुपालन से जुड़े रसद और लागत हैं जो लिनक्स डिस्ट्रोस में भाग नहीं लेते हैं।

POSIX ने जो कुछ किया है, उसमें से अधिकांश चीजों का विस्तार ISO C. Time.h का हिस्सा नहीं है, लेकिन ISO संस्करण में उस timer_tप्रकार या किसी भी फ़ंक्शन को शामिल नहीं किया गया है जो इसका उपयोग करते हैं। वे POSIX एक्सटेंशन से हैं , इसलिए लिनक्स हेडर में यह संदर्भ:

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

__USE_POSIX199309एक आंतरिक glibc प्रतीक है कि features.h में सेट किया गया है जब है _POSIX_C_SOURCE >= 199309L, जिसका अर्थ है कि POSIX.1b समर्थित होने की (देखें है feature_test_macros मैनपेज)। यह भी साथ समर्थित है _XOPEN_SOURCE >= 600

क्या अलग-अलग OS के बीच कोई भिन्न परिभाषित कार्य या विशेषताएँ हैं?

मुझे लगता है कि POSIX सिस्टम के बीच C के संबंध में, इससे बचने का एक प्रयास है, लेकिन ऐसा होता है। कुछ जीएनयू एक्सटेंशन (जैसे sterror_r()) हैं, जिनके पोसिक्स समकक्षों से असंगत हस्ताक्षर हैं। संभवतः ऐसा तब होता है जब POSIX एक्सटेंशन लेता है, लेकिन इसे संशोधित करता है, या वे केवल GNU द्वारा देखे गए विकल्प हैं - आप एक उपयुक्त का उपयोग करके एक या दूसरे का विकल्प चुन सकते हैं #define


बहुत अच्छा! यह कैसी व्याख्या!
कासमिया

1
POSIX और C मानक आंशिक रूप से C को यूनिक्स से अलग करने के बारे में थे - दोनों इतनी बारीकी से बंधे हुए थे कि कभी-कभी यह स्पष्ट नहीं होता था कि कहाँ गया था।
तेजस्वी

2

timer_tPOSIX में टाइमर_ API द्वारा उपयोग किया जाता है, जैसे कि timer_create()। POSIX के UNIX 03 संस्करण में, वे POSIX का एक वैकल्पिक हिस्सा हैं, और macOS ने इसे लागू नहीं किया। लिनक्स और सोलारिस, और संभवतः कुछ अन्य यूएन * एक्सस, ने किया।

तो आप जिस कोड को देख रहे थे वह लिनक्स और सोलारिस पर काम कर सकता है, लेकिन मैकओएस पर काम नहीं करेगा, जब तक कि ऐप्पल भविष्य में टाइमर एपीआई को लागू नहीं करता है। (वे POSIX विनिर्देश के वर्तमान संस्करण का हिस्सा हैं, इसलिए Apple को ऐसा करना होगा यदि वे विनिर्देश के संस्करण 3 के बजाय संस्करण 4 के अनुरूप होना चाहते हैं।)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.