perlからpro*cの戻り値を受け取るには?
たー
[E-Mail]
2000/03/16(木) 10:19:01
pro*Cでoracleのデータベースを検索した結果を戻り値(文字列)で返すプログラムを作り、perlからsystemコマンドを使って実行したのですが、
期待通りの値が返って来ません。
perlでpro*cを扱う時の注意点、
こうしたらいいという意見を聞かせてください。
らてる
2000/03/16(木) 11:02:58
$buf = `/xxx/xxx/program`;
とやれば、$bufにprogramの標準出力値が入ります。
たー
2000/03/16(木) 11:21:25
>$buf = `/xxx/xxx/program`;
>とやれば、$bufにprogramの標準出力値が入ります。
何も値が返ってこないみたいです。
ちなみにpro*c側は
mainの型がintで
returnを使って100を返しています。
:
:
int main(int argc, char *argv[])
{
:
return(100);
:
}
CT
2000/03/16(木) 11:58:38
>return(100);
exit(100);
では?
フシギバナ
2000/03/16(木) 12:54:12
みなさん、勘違いしていませんか。
return(100);やexit(100);は標準出力ではありません。
pro*c は stdoutポインタ や 2ディスクリプタへ出力しないと。
たー
2000/03/16(木) 13:14:19
>return(100);やexit(100);は標準出力ではありません。
あらら。だめなんですか。
>pro*c は stdoutポインタ や 2ディスクリプタへ出力しないと。
pro*cの呼び出し方も、pro*cのコーディングも
どうやればいいかわからなくなってきました。
コウノトリ
2000/03/16(木) 13:50:19
ret = 100;
printf("%d", ret);
exit(0);
ですね。
CT
2000/03/16(木) 14:53:00
私はPerl知りませんが、Cの場合system()の戻り値を8ビット右にシフトしてやれば、
標準出力しなくもシステムコールしたプログラムの終了値を得ることができます。
rtn = system("com") >> 8 ;
です。
rtnには100が入ります。
CT
2000/03/16(木) 14:55:06
>rtn = system("com") >> 8 ;
>です。
>rtnには100が入ります。
追記。
pro*cのプログラムがreturn(100); 又はexit(100);した場合です。
たー
2000/03/16(木) 15:41:57
どれもうまく行きません。
pro*c側でprintfすると、ブラウザで実行したとき
それを呼び出すcgiファイルをダウンロードしようとします。
ダウンロードした中身はhtmlファイルですが、
値は返ってきていないです。
8ビット右にシフトした場合、
1000を返しているのに
0が表示されました。
フシギバナ
2000/03/16(木) 16:34:24
pro*cのプログラムはCGIそのものですか、
>$buf = `/xxx/xxx/program`;
pro*cのプログラムはCGIでなく/xxx/xxx/programに対応するものです。
引用のソースものがCGIになります。
ですので、printfで大丈夫なはず。
CT
2000/03/16(木) 16:49:07
システムコールしたプロセスの終了値は8ビットで表現されます。
例えば、exit(100)なら、
0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0
~~~~~~~~~~~~~~~
この部分。
これを8ビット右にシフトすると、100が得られます。
>8ビット右にシフトした場合、
>1000を返しているのに
>0が表示されました。
8ビットしかないんですから、1000は無理です。
たー
2000/03/16(木) 17:35:06
すみませんが、もう1度質問の内容を明確にします。
・現在開発中のCGIはPerlでOracleデータを検索する部分をPro*C++で開発して
います。
・PerlからPro*C++をCallして検索結果(マスタデータの項目)を取得してCGI(Perl)
で検索した結果をブラウザに表示したい。
・上記の方法でPro*C++からOracleの検索した結果(マスタデータの項目内容)を
Perlに返す方法はないのでしょうか?
フシギバナ
2000/03/16(木) 17:54:32
基本的にはPro*C++のプリント文(標準出力)で、
CGI-Perlは それをバッククォートで受け取る。
だた、Pro*C++はいろいろな環境変数が必要なので注意が必要です。
コマンドラインから上手くいっても、Webからはなかなか動きません。
Pro*C++実行に必要な環境変数を十分検討してください。
特に親プロセスに設定しないと駄目な環境変数もあるみたいです。
Fuji.♪
[E-Mail]
[HomePage]
2000/03/16(木) 17:59:16
Perl側で取得したい値はPro*C++からの戻り値(return value)ではなく、出力結果(output)ですよね?
それはPro*C++側からは printf("data from DB"); で出力し、 $retstr = `/foo/bar/hogehoge`; で値を取得してやるのが自然だと思います。
>戻り値(文字列)で返すプログラム
だと、 char* main() って感じですよね。 (^_^;
勘違い?
wosamu
2000/03/16(木) 18:23:42
>どうやればいいかわからなくなってきました。
pro*C固有の問題じゃないような気はしますけど。
stdoutに吐き出すとかいうのがわからないのなら、
(1)一時ファイルに結果を吐き出してそれをperlで読み取る。
(2)perlでやってる部分もCプログラムでやってC言語のCGIとして動作させる
(3)逆にperlで全部やる
とか。
そういう話ではない???
wosamu
2000/03/16(木) 18:32:42
>どうやればいいかわからなくなってきました。
pro*C固有の問題じゃないような気はしますけど。
stdoutに吐き出すとかいうのがわからないのなら、
(1)一時ファイルに結果を吐き出してそれをperlで読み取る。
(2)perlでやってる部分もCプログラムでやってC言語のCGIとして動作させる
(3)逆にperlで全部やる
とか。
そういう話ではない???
CT
2000/03/16(木) 18:37:47
なんだ、データベースを検索した結果を終了コードとして取得したいんじゃないのか。(0なら成功、1なら失敗とか。)
勘違いしました。
「標準出力に結果を...」ということなら、wosamu さんの(2)か(3)に一票。
でも個人的には、データベースを検索するプログラムを1つ常駐させといて、
それにPerlのCGIからクエリーをなげて、結果を受け取る。
データベースを検索するプログラムと、CGIのプロセス間はソケット通信等を用いる。
ってのが好き。
たー
2000/03/21(火) 10:02:41
[[解決]]
pro*c側で
fprintf(stdout,"%s",orastr);
perl側で
open(INPIPE,"./prg/program $keyWord |" );
my @Data = <INPIPE>;
close(INPIPE);
という方法で解決しました。
ありがとうございました。