私はLinuxでunixとwin32(各ビルドでクロスコンパイル)プラットフォームの両方のためにアプリを開発しているので、すぐに使える関数がいいでしょう:)。関数を持つglibを使用していてgchar* g_get_current_dir(void)
、現在のディレクトリを返しますが、本当に必要なのは実行可能ファイルのディレクトリです。私はCプログラミングに不慣れなので、どんな提案でも大歓迎です。
3 に答える
Windowsの GetModuleFileName 。Linuxのargv[0]
注:クロスプラットフォームプログラミングを行う場合は、このレイヤーを非表示にするクロスプラットフォームライブラリも使用する必要があります(Qt、wxWidgets、ACE、Boost [わかりませんが、何かがあると思います] ...)
ディレクトリを持つUnixライクなオペレーティングシステムでは、/proc
ディレクトリがないreadlink
/proc/self/exe
場合でも、実際の実行可能ファイルのフルパスを取得できます。argv[0]
ただし、実行可能ファイルがで開始されfexecv
(多くのシステムでは使用できない)、それがシステムのシステムコールとして実装されている場合、これは機能しない可能性があります。 実行するファイル名ではなく、開いているファイル記述子が渡されることを除いて、fexecv
は同じです。execve
Linuxでは、 `" / proc / self /%i "、fd"によって生成された文字列を呼び出すことで実装されるexecve
ため、プログラムの開始時にファイルがファイルシステムに存在している必要があります。
fexecve
GNU/Hurdはネイティブにサポートしていると思います。
実行可能ファイルは、実行後に名前が変更されたり、ファイルシステムからリンク解除されたりする可能性があります。これにより、名前のないファイルになり、開くのをやめるとすぐに消えます(このコンテキストでは、ファイルを実行するには通常、次のことが必要です。カーネルによって開かれている)。
私は窓に話すことができません。ただし、UNIXでは、かなりの割合で可能ですが、保証されているわけではありません。この理由には、シェルなどの他のプログラムからexecを呼び出すことが含まれます。シェルなど、状況によっては、実行可能ファイルが存在する場所をクラウド化できます。たとえば、「../../../ mybin / exe/myprogram」などの相対パスです。PATH変数を使用すると、実行可能ファイルを追跡することも楽しくなります。
質問させてください。あなたは何をしようとしているのですか、もっと正確に言えば、なぜあなたは知る必要があるのですか?あなたが知る必要のないIMO。getcwd()を確認し、機能するディレクトリで実行していない場合は終了します。実行可能イメージがどこにあるかは問題ではありません。
これは、常にではなく、ほとんどの場合に機能する1つのコードハンクです。
mainからの呼び出しが必要です。argv[0]を使用します。シェルへのpopen()呼び出しを使用して、コードを小さな領域に収めています。popen()は必ずしも適切な選択ではありません。以前に他の実行可能ファイルがある場合、これは失敗する可能性があります。同じ名前のPATH内:
char *
mypath(const char *src)
{
FILE *cmd=NULL;
static char path_2_me[PATH_MAX]={0x0};
char tmp[PATH_MAX]={0x0};
const char *basename=strrchr(src, '/');
if(basename==NULL)
basename=src;
else
basename++;
if(memcmp(src, "./", 2)==0)
sprintf(path_2_me,"%s/%s", getcwd(tmp, PATH_MAX), basename);
else
{
sprintf(tmp, "/usr/bin/which %s", basename);
cmd=popen(tmp, "r");
fgets(path_2_me, sizeof(path_2_me), cmd); /* one read only */
pclose(cmd);
/* check for what your version of which says on failure */
if(memcmp(path_2_me, "no ", 3)==0)
*path_2_me=0x0;
}
return (*path_2_me) ?path_2_me: NULL;
}