एक 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
क्यों उपलब्ध है, लेकिन जाहिर तौर पर पर्यावरण चर की सूची में नहीं है। इसके आसपास कैसे जाएं?
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
};
darwin14
और darwin15
के बीच अंतर बताना चाहता हो, कोड को एक प्लेटफॉर्म पर संकलित करने के बाद इसका मतलब है कि यह या तो काम कर सकता है। यह स्पष्ट नहीं है।
uname
के आउटपुट का उपयोग कर सकते हैं?