• ベストアンサー

PerlとCで相互に通信をさせたい

クライアントサーバシステムによる制御システムを作っているのですが、HTMLの出力などユーザに接する主要な部分をPerlで書き、制御コマンドの発行などをCにやらせたいと考えています。そこで、例えばユーザの入力をPerlで受け、それをCに渡して実行させ、返って来た結果を再びPerlが受け取ってユーザに渡す。 こんなことってできますでしょうか。 system関数で、コマンドラインを呼び出すことはできるとは知っているのですが、引数を相互に渡せたら・・・と思うのですが・・・。

質問者が選んだベストアンサー

  • ベストアンサー
  • ysk6406
  • ベストアンサー率40% (237/589)
回答No.2

pythian さん、こんにちは。 > 例えばユーザの入力をPerlで受け、それをCに渡して実行させ、返って来た結果を再びPerlが受け取ってユーザに渡す。 いろいろなやり方がありますが、「ユーザの入力を C プログラムへの引数として渡す」ことを前提に、比較的簡単な方法として、以下のものはいかがでしょう。 例えば、Perl から ls コマンド(=C で書かれたプログラム)に引数としてオプションとパス名を渡し、得られた結果を1行ずつ読みとって Perl で処理することを考えます。 サンプルプログラムは、次のようになります。   open(CMD, "/bin/ls -l /var/log |") or die("Error: $!\n");   while (<CMD>) {     print ">>> ", $_;   }   close(CMD); 一般論として、/bin/ls が C のプログラム、-l /var/log がそれに渡す引数と思って下さい。また、最後の“|”は、「このプログラムの出力結果を CMD を通じて読み出す」ことを指示しています。これがポイントです。 得られた結果は、while (<CMD>) により、1行ずつ読み出されてきます。 ここでは、単に左に >>> を付加して表示させているだけですが、この部分を工夫すれば、お望みの処理ができると思います。 Perl と C の間で双方向の通信路(パイプライン)を張ってデータを受け渡すことも可能ですが、上の例に比べるとかなり複雑になります。

pythian
質問者

お礼

こんなものまでopenできたんですね。さすがPerlです。これで試してみます、ありがとうございました。

その他の回答 (1)

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

Perl は、よく知らないんですが、知っている範囲で。 Perl のモジュールのうち、幾つかは C で書かれています。多分、拡張モジュールと 呼ばれていると思います。 つまり、拡張モジュールを C で書けば、Perl の方からは、モジュールとしか見えません。 ただ、これには、そのための知識が必要になります。質問が出てきた背景を察するに C を経験した開発メンバーは多数居るが、Perl を扱える開発メンバーが余り居ない、 というところから出てきた質問のように思えます。 「制御コマンドの発行」というのは socket 経由でどこかに通信ということでしょうか? 素直に Perl を教え込むのが一番の近道だと思います。 もしくは、C で実装したいことを、なるべく少ない種類のインターフェースで共通化 して、ある人間だけがその作業に特化する方法もあるでしょう。 # 苦労の割には、報われない気がします

pythian
質問者

お礼

UDPのsocketなんですが、Perlでやろうと格闘して諦めました(笑)。結局、Cで書いたものに引数として渡し、標準入力から戻ってきたものを利用しようと思います。アドバイスありがとうございました。

関連するQ&A