ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

C言語とC++言語コミュのargv[0]以外でのプログラム名の取得

  • mixiチェック
  • このエントリーをはてなブックマークに追加
argv[0]以外でプログラム名を取得するにはどうすれば良いのでしょうか?
GCCのassert()でエラーになったとき

exe: main.c:35: main: Assertion `0' failed.
(プログラム名がexeのとき)

のように表示してくれているのでどうやって取得しているのか気になってます。

コメント(19)

ぐぐったらこんなのが出てきましたが.
http://msdn.microsoft.com/ja-jp/library/cc429127.aspx
ありがとうございます。
参考にさせていただきます。

ちなみにLinuxのGCCでもなにかGetModuleFileName()のようなものが
用意されているんでしょうかね?
argv[0] で何が不満なのかと。

あと、ソースプログラム名と行数の部分は、assert はマクロだという事と、__FILE__ と __LINE__ について調べれば仕組みは解ると思いますよ。
私の環境でgetprogname()を試してみたところ、未定義の関数となってしまいました。
CentOS5.2 GCC4.1.2です。

おそらくFreeBSDのC言語だったらgetprogname()を利用できるんでしょうね。
実行ファイルの名前を知る手続はOS依存です.
GetModuleFileNameはWindowsのAPI.UNIX(POSIX)系OSにはそんなAPIはない.

「そもそもファイル名は無い」ということもあるのがUNIX(POSIX)系OSなので,UNIX系OSでは不可能だと思います.
コンパイル時のファイル名は分かるかもしれませんが.

あとargv[0]はあくまで起動したときの実行ファイル名(これもOS依存で,argv[0]が空であることもC規格は許していますが)であって,実行後にファイル名を変えた場合は当然 argv[0]とファイル名が一致しないことになります.
プロセスIDから辿るというのもありかと思いますが、
それをassert()でやっているかと言うとよくわかりません。
glibc の assert() は argv[0] 使ってやってるっぽいねぇ・・
Linuxで同等のコードに置き換えれば basename(argv[0]) ってとこ?
int main(void) でも assert() は実行ファイル名を取得しているので
argv[0] 以外で取得する方法がきっとありそうなのですが・・・

実行ファイル名を取得した後は basename() でパスを排除してるんでしょうね。
CentOS 5.2
GCC 4.1.2です。
その他の環境ということでしょうか?
まあ、あるとしたら getpid() で pid 取って、/proc/*/cmdline 調べるくらいかね。
そろそろ glibc のソース解析くらい始めるかと思ったけど、Linuxでプログラム書くには向いて無いんじゃないの〜?みたいな。

ああ、ちなみに __progname はLSB定義外なんで、あらかじめ念のため。
ps が他プロセスのコマンド名を取れるんだから、自分が取れない理由は無いよねぇ。

さらに、BSDのgetprogname(3)が高度なことやってるわけではない。
普通に思いつくレベル
>12
そうですね.
みなさんに甘えてました.

いろいろ貴重なご意見ありがとうございました.
GNUのなんとかってパッケージの中のpsのソースを参考にするのがお手軽。
>9
基本的な事ですが、main()関数の呼び出しはCライブラリーの役目です。つまり実行ファイルがロードされて最初に実行されるコードはCライブラリーのコードです。gccの場合crt.o等です。つまりargv等のmain()関数の引数はCライブラリーのコードで処理された物と言うことになります。Linuxの場合確か実行ファイルのエントリーポイントが呼び出された時点でmain関数の引数に相当する物がスタックに詰め込まれているので、assert()はそれを利用しているのでは無いでしょうか?
procfsがまともにサポートされているなら、
/proc/<PID>/statをopenして'('と')'で囲まれたところを読む。
*BSDならkvmを使って、kvm_getprocsでkinfo_procを取得する。
kinfo_procの中のp_commに入っている。
__argv[0] は、どの程度のコンパイラで使用出来るのでしょう。

vc++ とか bc++ では使えるのですが…。

ログインすると、残り1件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

C言語とC++言語 更新情報

C言語とC++言語のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング