c - Programmatically retrieving the absolute path of an OS X command-line app -
लिनक्स पर, एक अनुप्रयोग आसानी से / proc / self / exe क्वेरी से इसकी पूर्ण पथ प्राप्त कर सकता है । नि: शुल्क बीएसडी पर, यह अधिक शामिल है, क्योंकि आपको एक sysctl कॉल का निर्माण करना है:
int mib [4]; एमआईबी [0] = सीटीएल_केआरएन; मिब [1] = केर्न_PROC; मिब [2] = केआरएन_PROC_PATHNAME; मिब [3] = -1; चार बफ [1024]; Size_t cb = sizeof (buf); Sysctl (एमआईबी, 4, बफ़, और सीबी, नल, 0); लेकिन यह अभी भी पूरी तरह से संभव है फिर भी मुझे यह आदेश रेखा अनुप्रयोग के लिए OS X पर निर्धारित करने का कोई तरीका नहीं मिल सकता है। यदि आप किसी ऐप बंडल के भीतर से चल रहे हैं, तो आप इसे [[NSBundle mainBundle] bundlePath] चलाकर निर्धारित कर सकते हैं, लेकिन क्योंकि कमांड लाइन अनुप्रयोग बंडलों में नहीं हैं, यह मदद नहीं करता है। / P>
(नोट: परामर्श argv [0] एक उचित जवाब नहीं है, क्योंकि, यदि एक सिमलिंक से शुरू किया जाता है, तो argv [0] सिमलिंक होगा - निष्पादन योग्य के लिए अंतिम पथ बुलाया नहीं। argv [0] भी एक झूठ आवेदन एक exec () कॉल का उपयोग करता है और argv ठीक से प्रारंभ करने के लिए भूल सकता है, जो झूठ कर सकते हैं, जो मैंने जंगली में देखा है।)
फ़ंक्शन निष्पादन योग्य (जीयूआई या पूर्ण नहीं)। पथ में प्रतीकात्मक लिंक हो सकते हैं, " .. ", आदि। लेकिन फ़ंक्शन का उपयोग उन लोगों को साफ करने के लिए किया जा सकता है यदि आवश्यक हो अधिक जानकारी के लिए देखें।
चार पथ [1024]; Uint32_t size = sizeof (पथ); अगर (_NSGetExecutablePath (पथ, और आकार) == 0) printf ("निष्पादन योग्य पथ% s \ n", पथ है); अन्य printf ("बफर बहुत छोटा; आकार% u \ n", आकार); इस फ़ंक्शन का रहस्य यह है कि डार्विन कर्नेल इस प्रक्रिया को बनाता है जब envp सरणी के तुरंत बाद प्रक्रिया स्टैक पर निष्पादन योग्य मार्ग रखता है डायनेमिक लिंक एडिटर dyld इसे आरंभ करने पर पकड़ लेता है और इसमें एक पॉइंटर रखता है। यह फ़ंक्शन उस पॉइंटर का उपयोग करता है।
Comments
Post a Comment