2008-10-01 13 views
9

से C++ में argc और argv तक कैसे पहुंच सकता हूं, मैं एक लाइब्रेरी लिख रहा हूं जिसे सी ++ में गतिशील रूप से लोड किया जाना है।मैं लाइब्रेरी फ़ंक्शन

मैं अपने कोड के भीतर से argc और argv (डीबगिंग कारणों के लिए) पढ़ना चाहता हूं, हालांकि मेरे पास मुख्य फ़ंक्शन तक पहुंच नहीं है। कमांड लाइन को पुनर्प्राप्त करने का कोई तरीका है (विंडोज़ और लिनक्स समाधान दोनों अच्छे होंगे)।

धन्यवाद, दान

उत्तर

11

Win32 एपीआई में GetCommandLine() फंक्शन नहीं है। अन्य प्लेटफ़ॉर्म पर, आपको कहीं भी argc/argv को सहेजना होगा (बाहरी चर?)।

12

लिनक्स पर छद्म फ़ाइल/proc/self/cmdline प्रक्रिया के लिए कमांड लाइन रखती है। प्रत्येक तर्क को 0 बाइट से समाप्त कर दिया जाता है, और अंतिम तर्क के बाद अतिरिक्त 0 बाइट होता है।

4

मेरा सुझाव है कि संभवत: यह एक अजीब स्थिति की तरह लगता है। क्या आप एक प्लगइन या कुछ लिख रहे हैं? शायद आपको argv/argc तक नहीं पहुंचना चाहिए?

+0

मैं सहमत हूं। यदि किसी पुस्तकालय को argv और argc तक पहुंच की आवश्यकता है, तो लाइब्रेरी शायद एक नया स्वरूप का उपयोग कर सकती है। – Landon

+1

जीटीके + की आवश्यकता है (या स्वीकार करता है, सुनिश्चित नहीं है) argc और argv पार्सिंग के लिए, कहते हैं, - डिस्प्ले पैरामीटर। यह भी इस मामले में उपयोगी हो सकता है; सोचो "--debug"। – aib

+0

argv और argc जीटीके + को पास कर दिया गया है जो पूरी तरह से समझदार है। मैं किस बात का जिक्र कर रहा था - और दानज क्या मांग रहा है - लाइब्रेरी के लिए argv और argc तक पहुंचने का एक तरीका था। – Landon

4

विंडोज़ में आप कमांड लाइन पर पॉइंटर प्राप्त करने के लिए GetCommandLine() का उपयोग कर सकते हैं और उसके बाद उस पॉइंटर को argv [] प्रारूप में परिवर्तित करने के लिए CommandLineToArgvW() का उपयोग कर सकते हैं। हालांकि, केवल एक विस्तृत (यूनिकोड) संस्करण उपलब्ध है।

0

getpid() और ps कमांड का उपयोग करें।

int pid;

int fd;

चार सेमीडी [80];

pid = getpid();

sprintf (cmd, "ps% d", pid);

fd = popen (cmd, "r");

.... लाइनों

.... 1358 की तरह होना चाहिए ./a.out एबीसी डीईएफ़

5

खिड़कियों आप उपयोग कर सकते हैं पर argc/argv के माध्यम से __argc और __argv। __wargv यदि आप विस्तृत वर्ण संस्करण चाहते हैं।

+0

__wargv – Martlark

+0

के लिए धन्यवाद यह वास्तव में एक भयानक विचार है! कोई भी प्रतीक जिसका नाम दो अंडरस्कोर से शुरू होता है, संकलक कार्यान्वयन द्वारा आंतरिक उपयोग के लिए आरक्षित है। आपको उपयोगकर्ता कोड में ___never___ इन्हें संदर्भित करना चाहिए। यह आत्म-प्रेरित अनिर्धारित व्यवहार का एक शास्त्रीय उदाहरण है - कोई भी (संभावित रूप से अवांछित) परिणाम संभव है। –

+0

अच्छा बिंदु! मुझे यकीन नहीं है कि मैंने विंडोज़ प्रश्न का उत्तर क्यों दिया। –

1

Windows पर, मैं तर्क पाने के लिए बात के इस प्रकार का उपयोग करें:


#include <windows.h> 
#include <string> 
#include <vector> 
#include <cwchar> 
#include <cstdio> 
#include <clocale> 
using namespace std; 

vector<wstring> getArgs() { 
    int argc; 
    wchar_t** argv = CommandLineToArgvW(GetCommandLineW(), &argc); 
    vector<wstring> args; 
    if (argv) { 
     args.assign(argv, argv + argc); 
     LocalFree(argv); 
    } 
    return args; 
} 

int main() { 
    const vector<wstring> argv = getArgs(); 
    setlocale(LC_CTYPE, ".OCP"); 
    for (vector<wstring>::const_iterator i = argv.begin(); i != argv.end(); ++i) { 
     wprintf(L"%s\n", i->c_str()); 
    } 
} 

संपादित करें: इस तरह एक getArgs समारोह भी MinGW के लिए उपयोगी MinGW एक wmain का समर्थन नहीं करता है()।

0

क्या आपने कमांड लाइन के बजाए पर्यावरण चर का उपयोग करने के बारे में कोई विचार दिया है? उपयोगकर्ता पर लाइब्रेरी का किस प्रकार के अनुप्रयोगों का उपयोग किया जाएगा, इस पर निर्भर करता है कि आप मानक getenv() फ़ंक्शन का उपयोग कर सकते हैं।

मुझे लगता है कि, यदि आपकी लाइब्रेरी argc और argv का उपयोग करने जा रही है, तो प्रोग्राम उन्हें पास करने वाला होना चाहिए।

1

यह लिनक्स के तहत काम करना चाहिए:

#include <stdio.h> 
#include <unistd.h> 

void findargs(int *argc, char ***argv) { 
    size_t i; 
    char **p = &__environ[-2]; 
    for (i = 1; i != *(size_t*)(p-1); i++) { 
     p--; 
    } 
    *argc = (int)i; 
    *argv = p; 
} 

int main(int argc, char **argv) { 
    printf("got argc=%d, argv=%p\n", argc, argv); 
    findargs(&argc, &argv); 
    printf("found argc=%d, argv=%p\n", argc, argv); 
    return 0; 
} 

नोट: विफल रहता है setenv() बुलाया गया है।

संबंधित मुद्दे