- ベストアンサー
実行ファイルの呼び出し
linuxでシステムの統合をしたいと考えております。 現在の状況はそれぞれのプログラムを別々の端末で実行し、それをTCP/IPで接続して連動して動作するようなシステムになっているのですが、一つのプログラムからそれぞれの実行ファイルを呼び出して使用するにはどのようにすればいいのでしょうか。 自分が調べたところによりますと実行ファイルを共有ライブラリ(.so)にしてそれを呼び出して使うという方法があり、単純な方法はわかったのですが(例えば"Hello World"と表示させる共有ライブラリを作り、それをmainで呼び出す)、引数や返り値があるときはときはどのように使えばいいのでしょうか? また、共有ライブラリ以外で実行ファイルを呼び出す方法はありますか? 開発環境はRed hat linux 8.0です。 ご教授のほどよろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
実行ファイルを呼び出すには、fork()とexecv()関数を使えばいいのではないでしょうか? forkは子プロセスを生成するシステムコールで、execvはプロセスイメージを新しいプロセスイメージで置き換える関数です。 つまり、まず呼出元のプロセスでforkを呼び、子プロセスを作成します。そして、子プロセス側の処理ルーチンで、execvシステムコールを呼べば、目的の実行ファイルを起動できます。 execvの他にもexecシリーズのシステムコールはあるので、参考URLを参照してみてください。 ちなみにWindowsの場合は、CreateProcessというAPIで他の実行ファイルを実行させることができます。
その他の回答 (1)
- tatsu99
- ベストアンサー率52% (391/751)
実行ファイルを呼び出す方法は、#1のかたが言われている方法が定番ですが、fork,execの方法は、初心者には敷居が高いようです。簡易版としてsystemを使用する方法があります。 int ret; ret = system("実行ファイル名"); とすると、実行ファイル名を呼び出すことができます。 そのあと、 if (ret==-1){ /* シェルの呼び出し失敗*/ }else{ ret = ret >> 8; print ("実行プログラムの終了コード=%d\n",ret); } のようにして、終了コードを取得することもできます。 一般的にfork,execを行うのは、実行ファイル名を子プロセスとして、実行し、呼び出し元のプログラムも、子プロセスが終了する迄に、他の何らかの処理を行う必要がある場合です。 systemを実行した場合は、呼び出されたプログラムが終了するまで、呼び出しもとは、他の処理ができません。 従って、それで良い場合は、systemを使用する方法が簡単です。 尚、引数は、プログラムの起動パラメータとして、渡します。system("実行プログラム名 p1 p2 p3"); のようにすると p1,p2,p3がパラメータとしてわたります。 この場合、引数は入力のみで、実行したプログラムの結果を、引数として受け取ることはできません。 終了コード以外の情報を呼び出しもとに返したいならば、何らかのファイルへ書き込み、それを、呼び出しもとが、読み込む等の方法があります。 実行プログラム名は、絶対パスで指定して下さい。(相対パスでもかまいませんが、PATH環境変数についての理解していることが前提です)
お礼
ありがとうございます。fork()とexecv()のことはまだ良くわかっていないので、今から勉強して試してみたいと思います。