C/C+:CとShellの情報交換方法

2778 ワード

一、リード
多くの場合、CプログラムとShellが情報をやり取りできることを期待しています.例えば、私たちはShellでCプログラムの実行を制御し、CプログラムがShellから関連情報を取得することを望んでいます.同様に、CプログラムからShellにいくつかの情報を返して、Shellが戻り情報に基づいて次の操作を実行する必要があります.
 
二、ShellはCプログラムに情報を伝達する
LinuxのCプログラミングに詳しい人なら誰でも知っていますが、C言語の「main」関数にはShellコマンドとのインタフェースがあります.
int main(int argc, char **argv)
{
    // body of main
}

ここで、「argc」(argument counts)は入力パラメータの個数を表し、「argv」(argumen values)は入力パラメータの値を表す.
次のコードを見てみましょう.
#include 

int main(int argc, char **argv)
{
    printf(" argc = %d 
", argc); printf(" argv0 = %s
", argv[0]); printf(" argv1 = %s
", argv[1]); printf(" argv2 = %s
", argv[2]); return 0; }

実行可能ファイル「./exchange_msg_shell」としてコンパイルし、shellコマンドラインで実行します.
./exchange_msg_shell hello world

出力は次のとおりです.
argc = 3
argv0 = ./exchange_msg_shell
argv1 = hello
argv2 = world

パラメータ「argc」は、入力パラメータの個数を格納し、パラメータ「argv」は、入力パラメータの値を配列的に格納し、最初の値「argv[0]」は、実行可能ファイルのファイル名を表し、「argv[1],argv[2]」は、後続のパラメータ値を順次表す.
さらに、パラメータは、配列「argv」のタイプが「char」であるため、数値タイプ(整形int、浮動小数点型floatなど)であっても文字列の形で伝達される.では、Shellから数値タイプの入力を受信するにはどうすればいいのでしょうか.まずShellから文字タイプの入力を受信し、Cプログラムの内部でタイプ変換を使用して、文字タイプを必要な数値タイプに変換することができます.C言語で文字列を整数に変換する関数は「atoi」(ascii to integer)であり、文字列を浮動小数点数に変換する関数は「atof」(ascii to floating point numbers)であり、いずれもヘッダファイル「#include」に含まれ、入力パラメータとして文字列を受信し、出力パラメータは「int」または「float」タイプの数である.
 
三、CプログラムはShellに情報を伝達する
Cプログラムの実行には必ず戻り値があり、一般的には、順調に実行が終了すると、最後にmain関数は「0」の値を返します.一方、実行中にエラーが発生すると、Cプログラムは0以外の値を返します.(戻り値はプログラミングによって異なりますが、一般的に戻り値が0の場合はスムーズな実行が完了し、戻り値が0以外の場合は実行中にエラーが発生します)
実は、ShellコマンドでCプログラムを実行する場合、そのCプログラムは通常のShellコマンドと同じです.Shellコマンドを実行すると、実行に成功し、値0が返されます.実行に失敗すると、0以外の値が返されます.そして、Shellにはシステム環境変数「$?」があります.に登録してあるものです.これにより、Cプログラムを実行した後、システム環境変数「$?」を通過することができます.Cプログラムが順調に実行されたかどうかを判断します.たとえば、現在のディレクトリの下に「./test 1」というフォルダがあり、コマンド「cd」を使用してフォルダ「./test 1」に切り替えることができます.
cd test1/

この操作は成功し、コマンドラインは何の情報も返さなかった(UNIXの哲学によると「メッセージがなければ良いニュースだ」)が、実際にはシステムは変数「$?」コマンドの戻り値(コマンドの終了状態とも呼ばれる)を記録し、「$?」を表示できます.の値:
echo $?

出力は「0」で、コマンドが正常に実行されたことを示します.コマンド「cd」を使用して、現在のフォルダに存在しないフォルダ「./test 2」に切り替えてみましょう.
cd test2/

端末はエラーメッセージを印刷します.
bash : cd : test2/: No such file or directory

現在のフォルダの下に「test 2/」フォルダが存在しないことを示します.変数「$?」を見てみましょう値、ゼロ以外の値が見つかりました.
我々自身がソースコードでリンクをコンパイルして作成した実行可能ファイルは、通常のShellコマンドと本質的な違いはなく、Shellも変数「$?」に表示されます.しかし、このシステム環境変数「$?」情報を伝達する方式に来て、伝達する情報の量は少なすぎて、Cプログラムの実行が成功するかどうかを知るしかありません.Shellでより多くのCプログラムに関する情報を取得することを望む場合は、Cプログラムに対応する出力が関連ファイル(例えば、Cプログラムが実行するログファイル)に格納され、Shellでそのファイルから情報を読み出し、次の処理を行う必要があります.