एक C प्रोग्राम में, मुझे रनटाइम के दौरान OSTYPE खोजने की जरूरत है, जिसके आधार पर मैं कुछ ऑपरेशन करूंगा।

यहाँ कोड है

#include <stdlib.h>
#include <string.h>

int main () {
    const char * ostype = getenv("OSTYPE");
    if (strcasecmp(ostype, /* insert os name */) == 0) ... 
    return 0;
}

लेकिन getenv रिटर्न NULL (और सेगमेंटेशन फॉल्ट है)। जब मैं टर्मिनल में echo $OSTYPE करता हूं तो यह darwin15 प्रिंट करता है। लेकिन जब मैं env | grep OSTYPE करता हूं तो कुछ भी प्रिंट नहीं होता है, जिसका अर्थ है कि यह पर्यावरण चर की सूची में नहीं है। इसे अपनी स्थानीय मशीन पर काम करने के लिए मैं .bash_profile पर जा सकता हूं और OSTYPE को मैन्युअल रूप से निर्यात कर सकता हूं लेकिन अगर मैं एक नई मशीन पर जेनरेट किए गए निष्पादन योग्य को चलाने के लिए समस्या का समाधान नहीं करता हूं।

टर्मिनल चलाते समय OSTYPE क्यों उपलब्ध है, लेकिन जाहिर तौर पर पर्यावरण चर की सूची में नहीं है। इसके आसपास कैसे जाएं?

0
abkds 8 सितंबर 2016, 05:07
हाँ, लेकिन यह UNIX माना जाता है, है ना? developer.apple.com/library/ ios/दस्तावेज़ीकरण/सिस्टम/वैचारिक/…
 – 
abkds
8 सितंबर 2016, 05:09
क्योंकि बैश इसे सेट करता है। कोई बैश नहीं, कोई चर नहीं।
 – 
Ignacio Vazquez-Abrams
8 सितंबर 2016, 05:09
अगर मैं कहीं और निष्पादन योग्य चलाता हूं, तो मुझे OSTYPE जानने की जरूरत है।
 – 
abkds
8 सितंबर 2016, 05:10
1
मैं इसे एक शॉट दूँगा।
 – 
abkds
8 सितंबर 2016, 05:19
1
क्या आप इसके बजाय केवल uname के आउटपुट का उपयोग कर सकते हैं?
 – 
Crowman
8 सितंबर 2016, 05:21

1 उत्तर

सबसे बढ़िया उत्तर

क्रैश के लिए, आपको यह जांचना चाहिए कि strcmp या किसी फ़ंक्शन में इसका उपयोग करने से पहले रिटर्न NULL था या नहीं। आदमी 3 getenv से:

getenv() फ़ंक्शन पर्यावरण में मान के लिए एक सूचक देता है, या यदि कोई मेल नहीं है तो NULL।

यदि आप POSIX (अधिकांश यूनिक्स और किसी तरह सभी लिनक्स) पर हैं, तो मैं पॉल की टिप्पणी से सहमत हूं।

लेकिन वास्तव में आप प्रीकंपेलर (# ifdef's के साथ) के साथ संकलन समय पर OSTYPE की जांच कर सकते हैं, यहां एक समान प्रश्न है: रनटाइम के दौरान OS निर्धारित करें

संपादित करें: नाम बदलें

अच्छा बिंदु जोनाथन। मेरे लिनक्स पर मैन 2 uname बताता है कि कैसे उपयोग करना है (और POSIX शुरू करें, मैकोज़ का एक ही शीर्षलेख भी है):

सार

   #include <sys/utsname.h>

   int uname(struct utsname *buf);

विवरण uname () buf द्वारा इंगित संरचना में सिस्टम की जानकारी देता है। Utsname संरचना में परिभाषित किया गया है:

       struct utsname {
           char sysname[];    /* Operating system name (e.g., "Linux") */
           char nodename[];   /* Name within "some implementation-defined
                                 network" */
           char release[];    /* Operating system release (e.g., "2.6.28") */
           char version[];    /* Operating system version */
           char machine[];    /* Hardware identifier */
       #ifdef _GNU_SOURCE
           char domainname[]; /* NIS or YP domain name */
       #endif
       };
1
Community 23 मई 2017, 13:29
हो सकता है कि ओपी रनटाइम पर darwin14 और darwin15 के बीच अंतर बताना चाहता हो, कोड को एक प्लेटफॉर्म पर संकलित करने के बाद इसका मतलब है कि यह या तो काम कर सकता है। यह स्पष्ट नहीं है।
 – 
Jonathan Leffler
8 सितंबर 2016, 09:45