2012-01-03 17 views
5

के दौरान ओएस निर्धारित करें न तो आईएसओ सी और न ही POSIX रनटाइम के दौरान अंतर्निहित ओएस निर्धारित करने के लिए कार्यक्षमता प्रदान करते हैं। सैद्धांतिक दृष्टिकोण से, इससे कोई फर्क नहीं पड़ता क्योंकि सी सबसे आम सिस्टम कॉल के लिए सी प्रदान करता है, और नाइट-पिकिंग पॉइंट व्यू से, एक अंतर्निहित ओएस भी नहीं है।रनटाइम

हालांकि, कई वास्तविक दुनिया परिदृश्यों में, सी मेजबान पर्यावरण के बारे में और जानना उपयोगी साबित हुआ है, सी साझा करने के इच्छुक है, उदाहरण के लिए कॉन्फ़िगरेशन फ़ाइलों को स्टोर करने के लिए या select() पर कॉल करने के तरीके को जानने के लिए, 0:

क्या रनटाइम के दौरान अंतर्निहित ओएस निर्धारित करने के लिए सी में लिखे गए किसी एप्लिकेशन के लिए एक बेवकूफ तरीका है?

कम से कम, क्या मैं आसानी से लिनक्स, विंडोज, बीएसडी और मैकोज़ के बीच निर्णय ले सकता हूं?

मेरा वर्तमान अनुमान कुछ फ़ाइलों/निर्देशिकाओं जैसे C:\ या / के अस्तित्व की जांच करना है, लेकिन यह दृष्टिकोण अविश्वसनीय लगता है। हो सकता है कि ऐसे स्रोतों की एक श्रृंखला से पूछताछ से "ओएस फिंगरप्रिंट" की धारणा स्थापित करने में मदद मिल सके, इस प्रकार विश्वसनीयता बढ़ रही है। वैसे भी, मैं आपके सुझावों की प्रतीक्षा कर रहा हूं।

+11

एर, आप संकलन समय –

+0

पर इस जानकारी कैसे पर * क्रम * मदद ओएस का निर्धारण करता है पता है कि तुम एक 'चयन()' कॉल सही ढंग से लिखें? –

+0

+1, @ डेविड। कम से कम लिनक्स बनाम विंडोज बनाम मैक ओएस एक्स, आदि जैसे मतभेदों के लिए मुझे लगता है कि उनमें से प्रत्येक के विभिन्न संस्करणों के बीच अंतर करने के लिए एक रनटाइम तरीका हो सकता है जो ओपी की तलाश में हो, लेकिन इसका उत्तर प्रत्येक के लिए विशिष्ट होगा ऑपरेटिंग सिस्टम, संभवतः। –

उत्तर

5

दरअसल, अधिकांश प्रणालियों में uname कमांड होता है जो वर्तमान कर्नेल को उपयोग में दिखाता है। मैक ओएस पर, यह आमतौर पर "डार्विन" होता है, लिनक्स पर यह सिर्फ सादा "लिनक्स" है, विंडोज़ पर यह "त्रुटि" है और फ्रीबीएसडी "फ्रीबीएसडी" वापस कर देगा।

More complete list of uname outputs

मैं पूरी तरह से सुनिश्चित uname के लिए एक सी बराबर नहीं है कि कर रहा हूँ ताकि आप system()

+0

आपने मुझे इसे हराया। – rsaxvc

+0

ऐसा लगता है कि मैंने आप सभी को हराया :-) –

+0

@Tom क्या आप निश्चित हैं कि विंडोज पर क्या होता है? सभी सी कंपाइलर्स के लिए? –

2

यदि आप एक POSIX सिस्टम पर कर रहे हैं की जरूरत नहीं होगी, तो आप uname से कॉल कर सकते हैं() <sys/utsname.h>

यह स्पष्ट रूप से 100% पोर्टेबल नहीं है, लेकिन मुझे नहीं लगता कि कोई भी तरीका होगा जो इसे रनटाइम पर दे सकता है।

विवरण

1

के लिए the man page देखने के क्रम में किया जा रहा है कि महाकाव्य kludges binaries के बिना एक मंच एक और पर नहीं चलेंगे के लिए, तो आप सिर्फ #ifdef रों मंच संवेदनशील कोड के आसपास का उपयोग करना चाहिए, समय यह निर्धारित करने के लिए नहीं है।

+2

-1 क्योंकि प्रश्न रनटाइम पर ऑपरेटिंग सिस्टम को निर्धारित करने के बारे में था, यह नहीं कि आपको ऐसा करना चाहिए या नहीं। – Ataraxia

+0

हाँ, लेकिन यह ओपी की मदद नहीं करता है। _VAST_ अधिकांश मामलों के लिए फ्रीबीएसडी के लिए उत्सर्जित एक वस्तु लिनक्स पर काम नहीं करेगी (जो उसके ज्यादातर मामलों के लिए रखती है) इसलिए रनटाइम पर ऐसा करना उनकी पीड़ाओं में से कम से कम है। – richo

-2
if (strchr(getenv("PATH"),'\\')) 
    puts("You may be on windows..."); 

यहां तक ​​कि मैं मानता हूँ कि ऐसा "रनटाइम समय इस निर्धारित करने के लिए नहीं है ..."