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);

という方法で解決しました。
ありがとうございました。

[上に] [前に] [次に]