c++からのpipe,fork,execを用いた外部プログラムのコントロール
Posted: 2011年8月07日(日) 00:21
皆様、お世話になっております。
C++から既存のコードシステム(fortranで記述、実行ファイルのみ)を
コントロールする必要があり、勉強中です。表題にありますように、
やるべきことは分かってはいるのですが、敷居が高すぎて、少々
ご協力いただきたいと考えて居ります。
対象のコードは標準入力から受け取った入力を処理し、標準出力
に結果を吐き出すものです。
とりあえず、以下のような(target.fと名づけます)コードでテストしております。 これは標準入力から取得した文字列を標準出力から吐き出すためのコードです。
pipe等の使い方に関しては
http://www.ncad.co.jp/~komata/c-kouza3.htm
が参考になり、もしかしたら、そのまま使えそうなサンプルが記載されておりました。
以下のようなものです。
引数としてはコマンドと、書き込み、読み込み用のファイルディスクリプタのポインター
(これが分かりません)を渡すと記載されているのですが使い方がいまいち分かりません。
当面の目標としては、上記のtarget.fをコンパイルしたものをC++より操作し"hello"と標準入力
から入力しtargetfが標準出力から吐き出した"hello"を受け取りたいと考えております。
とりあえず、popen2の動作について簡単に教えていただけると助かります。
(元サイトの説明は私には難しすぎます。)
また、pstreamというものをお使いの方は、私のやろうとしていることが実現できるか
お知らせいただければ助かります。(テストケースをのぞいた感じではなさそうでしたが)
C++から既存のコードシステム(fortranで記述、実行ファイルのみ)を
コントロールする必要があり、勉強中です。表題にありますように、
やるべきことは分かってはいるのですが、敷居が高すぎて、少々
ご協力いただきたいと考えて居ります。
対象のコードは標準入力から受け取った入力を処理し、標準出力
に結果を吐き出すものです。
とりあえず、以下のような(target.fと名づけます)コードでテストしております。 これは標準入力から取得した文字列を標準出力から吐き出すためのコードです。
pipe等の使い方に関しては
http://www.ncad.co.jp/~komata/c-kouza3.htm
が参考になり、もしかしたら、そのまま使えそうなサンプルが記載されておりました。
以下のようなものです。
#include <stdio.h>
#include <signal.h>
#define R (0)
#define W (1)
int popen2(command,fd_r,fd_w)
char *command;
int *fd_r,*fd_w;
{
int pipe_c2p[2],pipe_p2c[2];
int pid;
/* Create two of pipes. */
if(pipe(pipe_c2p)<0){
perror("popen2");
return(-1);
}
if(pipe(pipe_p2c)<0){
perror("popen2");
close(pipe_c2p[R]);
close(pipe_c2p[W]);
return(-1);
}
/* Invoke processs */
if((pid=fork())<0){
perror("popen2");
close(pipe_c2p[R]);
close(pipe_c2p[W]);
close(pipe_p2c[R]);
close(pipe_p2c[W]);
return(-1);
}
if(pid==0){ /* I'm child */
close(pipe_p2c[W]);
close(pipe_c2p[R]);
dup2(pipe_p2c[R],0);
dup2(pipe_c2p[W],1);
close(pipe_p2c[R]);
close(pipe_c2p[W]);
if(execlp("sh","sh","-c",command,NULL)<0){
perror("popen2");
close(pipe_p2c[R]);
close(pipe_c2p[W]);
exit(1);
}
}
close(pipe_p2c[R]);
close(pipe_c2p[W]);
*fd_w=pipe_p2c[W];
*fd_r=pipe_c2p[R];
return(pid);
}
(これが分かりません)を渡すと記載されているのですが使い方がいまいち分かりません。
当面の目標としては、上記のtarget.fをコンパイルしたものをC++より操作し"hello"と標準入力
から入力しtargetfが標準出力から吐き出した"hello"を受け取りたいと考えております。
とりあえず、popen2の動作について簡単に教えていただけると助かります。
(元サイトの説明は私には難しすぎます。)
また、pstreamというものをお使いの方は、私のやろうとしていることが実現できるか
お知らせいただければ助かります。(テストケースをのぞいた感じではなさそうでしたが)