プログラミング工房 > Linux/C/C++ > Tips >

コマンドライン引数の取得(プロセスファイルシステムを利用する)

プロセスファイルシステム

 C言語やC++言語のプログラムで起動時のコマンドライン引数を取得する方法としては、main関数の引数(通常argc、argvという名前にするアレ)が一般的だと思いますが、Linuxではプロセスファイルシステムを経由して取得することもできます。

 プロセスファイルシステムとは、実行中のプロセスの情報をリアルタイムに取得できる仕組みで、ファイルシステムの/proc以下のパスに各プロセスを表すディレクトリ(プロセスIDが名前になっている)とそこに格納されたファイル群として存在しています(各プロセスの情報以外に動作中のカーネルの情報を表すファイルもある)。各ディレクトリおよびファイルはNautilusなどのファイルマネージャで表示させることができますが、サイズはほとんどが0です。

プロセスファイルシステムからコマンドライン引数を取得する

 上記のファイル群のうち、コマンドライン引数が格納されたファイルには/proc/(プロセスID)/cmdlineからアクセスすることができ、特に自分を表すプロセスのそれにアクセスする場合、/proc/self/cmdlineというパスも有効になります。ファイルフォーマットは、ヌル文字終端形式の各引数が単純に入力順につながった形になっており(スペース区切りではない。末尾にもヌル文字がある)、main関数の引数から取得する場合と同じように二重引用符は削除されています。内容の取得は通常のファイルと同じように、fopenで開き、fgetcなどで読み取り、fcloseで閉じるという手順で可能です。

 プロセスファイルシステムからコマンドライン引数以外に取得できるプロセス情報としては、他に環境変数、作業ディレクトリのパス、実行ファイルのパスなどがあります。中にはライブラリ関数一発で取得できるものもありますが、プロセスファイルシステムの場合、自分以外のプロセスの情報にもアクセスできるのが特徴です。