मुझे आश्चर्य है कि कोई ग्लिब फ़ंक्शन है जिसे मैं जीसीसी/जी ++ से उपयोग कर सकता हूं जो वर्तमान निष्पादन योग्य को पुनर्प्राप्त करेगा।glibc फ़ंक्शन?
इसका उद्देश्य के रूप में this answer
मुझे आश्चर्य है कि कोई ग्लिब फ़ंक्शन है जिसे मैं जीसीसी/जी ++ से उपयोग कर सकता हूं जो वर्तमान निष्पादन योग्य को पुनर्प्राप्त करेगा।glibc फ़ंक्शन?
इसका उद्देश्य के रूप में this answer
मानक सी और 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
पारित करने में सक्षम हो सकता है:
तो तुम इस तरह वास्तविक पूर्ण निष्पादन योग्य पथ प्राप्त कर सकते हैं।
आप उपयोग कर सकते हैं 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 वातावरण देखें।
आप इसे argv से प्राप्त कर सकते हैं [0] – BlackBear
क्या तर्क है [0] क्या आप चाहते हैं, किसी कारण से? – thb