自分の実行ファイルの置かれた場所を調べる方法

実行ファイルhogehogeが実行されたときhogehogeがどこにいるかをプログラム上から調べる方法
カレントディレクトリと起動引数からの相対パスを使って調べる方法もあるが
子プロセスとして呼ばれる場合(fork() -> execl()等)起動引数に相対パスが入ってこない
ちなみにexecl()の第一引数にパスを渡すが、そのパスはカレントディレクトリや環境変数のPATHとして反映はされない
で、どうやったのかというとPROCファイルシステムを利用して取ってくる
/proc/自分のプロセスID/ に起動したプロセスの情報がある
その下にexeというシンボリックリンクがあり、それが自分自身を挿しているため
readlink()でリンクを文字列でとりだしてやるとhogehogeの絶対パスが取得できる
こんな感じ
char path[256]; // 絶対パス格納
char symlink[256]; // シンボリックリンクパスの格納
sprintf( symlink, "/proc/%d/exe", getpid() );
readlink( symlink, path, sizeof(path) );
尚、この処理はPROCファイルシステムに依存するため、Linuxカーネルが古いと使用できない
(2.2以前か2.0以前だと/proc/xxx/exeがシンボリックリンクじゃない)