2012-04-28 10 views
10

मुझे आश्चर्य है कि कोई ग्लिब फ़ंक्शन है जिसे मैं जीसीसी/जी ++ से उपयोग कर सकता हूं जो वर्तमान निष्पादन योग्य को पुनर्प्राप्त करेगा।glibc फ़ंक्शन?

इसका उद्देश्य के रूप में this answer

+5

आप इसे argv से प्राप्त कर सकते हैं [0] – BlackBear

+0

क्या तर्क है [0] क्या आप चाहते हैं, किसी कारण से? – thb

उत्तर

12

मानक सी और glibc में में दिखाया गया addr2line को -e तर्क प्रदान करने के लिए है, तो आप argv है [0]:

int main (int argc, char *argv[]) 

के पहले तत्व argv सरणी प्रोग्राम का नाम है।

हालांकि यह निश्चित रूप से यह निर्धारित करने के लिए पर्याप्त नहीं है कि निष्पादन योग्य कहां है। तर्क वास्तव में प्रोग्राम द्वारा निर्धारित किया जाता है जो आपके प्रोग्राम को चलाता है - चाहे वह एक खोल या खिड़की प्रबंधक हो - और वे बहुत उपयोगी नहीं हैं। अपने कार्यक्रम के रास्ते में है और आप एक bash खोल में

your_program

साथ बस प्रोग्राम चलाते हैं, तो "your_program" तुम सब argv में मिल जाएगा है [0]।

पूर्ण निष्पादन योग्य पथ के लिए, लिनक्स में /proc filesystem है। /proc के तहत प्रत्येक चलती प्रक्रिया को अपनी "निर्देशिका" मिलती है, जिसका नाम इसकी प्रक्रिया आईडी द्वारा किया जाता है। चल रही प्रक्रिया /proc/self के तहत अपनी खुद की उप-धारा भी देख सकती है। प्रत्येक प्रक्रिया को प्राप्त करने वाली फ़ाइलों में से एक /proc/[pid]/exe है, जो कि वास्तविक निष्पादन योग्य प्रक्रिया का एक प्रतीकात्मक लिंक है।

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <unistd.h> 

int main(void) { 
    char exe[1024]; 
    int ret; 

    ret = readlink("/proc/self/exe",exe,sizeof(exe)-1); 
    if(ret ==-1) { 
     fprintf(stderr,"ERRORRRRR\n"); 
     exit(1); 
    } 
    exe[ret] = 0; 
    printf("I am %s\n",exe); 
} 

तुम भी addr2line() के लिए सीधे /proc/[pid]/exe पारित करने में सक्षम हो सकता है:

तो तुम इस तरह वास्तविक पूर्ण निष्पादन योग्य पथ प्राप्त कर सकते हैं।

+1

शानदार! यह सही काम करता है – lurscher

+0

इस मामले में '/ proc/self/exe' का उपयोग करना आसान है ताकि 'getpid()' कॉल की आवश्यकता न हो। – Diego

5

आप उपयोग कर सकते हैं argv [0] वास्तविक चर के लिए एक संदर्भ के बिना, glibc में एक बचाया सूचक का उपयोग करके: https://github.com/rbdixon/glibc/blob/master/misc/init-misc.c

उदाहरण उपयोग:

extern const char *__progname; 

int print_progname() 
{ 
    return puts(__progname); 
} 

argv [0] जरूरी प्रतिबिंबित नहीं करता है वह नाम जिसका प्रयोग प्रोग्राम को आमंत्रित करने के लिए किया गया था। अधिक जानकारी के लिए मैन 2 और मैन 7 वातावरण देखें।

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