2016-11-29 3 views
2

私はCでプログラムをコーディングしています。私はそれ自身の名前を検出したいと思います。私は説明します:gccでコンパイルした後に実行ファイルの名前を取得する方法は?

名前に応じて特定のアクションを実行します。さんが言ってみましょう:

if (!strcmp(myName, "Program1")) 
     printf("I am program 1!"); 
    else 
     printf("I am someone else !"); 

このコードはProgram1.cに含まれている、としてコンパイルされています

gcc Program1.c -o Program1 

そして私はそれを実行したい:

./Program1 

しかし、私は私が与えたコードの変数myNameとなる値 "Program1"(実行可能ファイルの名前)を得ることができるコードを見つけることができません。

誰かが私を助けてくれますか?

+1

まず、Cでは、文字列を 'myName ==" Program1 "'と比較することはできません。しかし 'main'では実行可能な名前である' argv [0] 'をチェックすることができます。 –

+0

申し訳ありませんが、私は疲れていました。私が欲しかったものを作りたいと思っていましたが、確かに間違っています。ご回答有難うございます! – Alan

+0

MSVC 'argv [0]'には、コンソールで入力したもの、例えば 'test.exe'や' .. \ ctest \ test'などがあり、GUIから実行すると 'F:\ Work \ CTEST \ test.exe'を実行します。だからあなたの名前のマッチングは、慎重にする必要があります;) –

答えて

3

gccからの出力の名前は、デフォルトではファイルのどこにも保存されません。バイナリに挿入する方法はわかりません。しかし、これは本当に欲しいものですか?

の名前は、として呼び出され、argv[0]として入手できます。コンパイル後に実行可能ファイルの名前が変更された場合は、それが異なる場合があります。

#include <stdio.h> 
int main(int argc, char *argv[]) { 
    printf("My name is %s\n", argv[0]); 
    return 0; 
} 

引数0は、呼び出し側プログラムによって選択されます。ディレクトリ情報を持つ完全なパス(通常、呼び出し元がPATHルックアップを実行したか、実行可能ファイルを明示的な場所から呼び出したかによって異なります)に基づいて動作したい場合は、おそらくパス情報を削除する必要があります(basename Unix/POSIXプラットフォームで)。

引数0は呼び出し元によって選択されるため、規約上の問題です。しかし、通話者がそれを尊重しない理由がある場合を除いて、これはかなり普遍的に行われています。ほとんどのプラットフォームでは、実行可能ファイルを見つける方法があります。たとえば、Linuxの場合、/proc/self/exeは実行可能ファイルへのシンボリックリンクです。しかし、ほとんどの場合、呼び出し元が別の名前を渡すと、呼び出し元がプログラムの別の名前として動作することを意味するため、argv[0]を使用する必要があります。

argv[0]プログラムが引数なしで呼び出された場合(つまり、argcが0の場合)は、NULLにすることができます。それはまれですが、堅牢性のために、あなたのプログラムはそのような場合に賢明な何かをするべきです。

+0

お返事ありがとうございます、私はそれを回避することができるだろうと思う! – Alan

関連する問題