私はgcc/g ++から現在の実行可能ファイルを取得するglibc関数があるのだろうかと思います。現在の実行可能ファイル名を取得するglibc関数?
この目的は、標準Cとglibcでthis answer
私はgcc/g ++から現在の実行可能ファイルを取得するglibc関数があるのだろうかと思います。現在の実行可能ファイル名を取得するglibc関数?
この目的は、標準Cとglibcでthis answer
に示すようaddr2line
に-e引数を提供することであり、あなたがargvをしている[0]:
int main (int argc, char *argv[])
の最初の要素argv
配列はプログラム名です。
ただし、実行可能ファイルがどこにあるかを判断するだけでは必ずしも十分ではありません。この引数は実際には、プログラムを実行したプログラム(シェルやウィンドウマネージャ)によって設定されますが、あまり役に立ちません。あなたのプログラムがパス内にある、あなたはbashシェルで
your_program
で簡単にプログラムを実行すると、「your_programは、」あなたはARGVになりますすべての[0]です。
完全な実行可能パスについては、linuxには/proc
filesystemがあります。 /proc
の下では、実行中の各プロセスはプロセスIDで指定された独自の「ディレクトリ」を取得します。実行中のプロセスは、/proc/self
の下の独自のサブツリーも見ることができます。各プロセスが取得するファイルの1つは/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]は必ずしも反映していませんプログラムを呼び出すために使用された名前。 詳細については、man 2 execveおよびman 7 environを参照してください。
あなたはargv [0] – BlackBear
から得ることができます何らかの理由でargv [0]はあなたが望むものではありませんか? – thb