• ベストアンサー

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

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

  • CGI
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • 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

  • PERLスクリプトのコマンドライン実行

    お世話になります。 Perlスクリプトをコマンドライン実行するとき、 perl スクリプト名.pl とすると思いますが、その際、コマンドライン引数を渡してスクリプト内で、その引数を見て処理したいと思うのですが、そういうことできますか?引数の渡し方、受け取り方を教えてください。

    • ベストアンサー
    • Perl
  • perl system関数 引数 フォルダ

    perlのsystem関数を使って、コマンドを実行したいのですが、 実行ファイルの引数にフォルダを指定すると、うまく動作しません。 以下のように書いています system "実行ファイル フォルダ"; 実行ファイルは .BATファイルで、 指定しているフォルダには複数のテキストファイルが入っています。 perlで書いたcgiファイルは実行ファイルと同じディレクトリにあります。 コマンドからではなく、手動でドラッグ&ドロップすると正常に動作します。 windous7でperlはActivePerlを使用しています。 引数にはフォルダを指定できないのでしょうか? またフォルダを指定できない場合、解決策などはあるのでしょうか? よろしくおねがいいたします。

    • ベストアンサー
    • Perl
  • perlでのtext読み込み

    perlで.txtファイルを読み込むのはどうすればいいのでしょうか? コマンドライン引数ではなくC言語でいうscanfのようにプログラム実行した後にtxtファイルを指定して読み込ませたいです。 わかる人がいたら教えてください、お願いしますm(_ _;m)

    • ベストアンサー
    • Perl
  • コマンドラインでタイプすることとperlでsystem関数の違いは?

    winでperl5.8を使っています。 コマンドプロンプトで cl test.cとすると、コンパイルできますが perlからsystem("cl test.c")とすると、sys/types.hがありません とエラーになります。 コマンドラインでタイプすることとperlでsystem関数を使う場合とでは どんな違いがあるのでしょうか? CはVC++6を入れています。

  • cronでのPerlスクリプト実行

    少し前に同様の質問をしましたが、やはり解決していませんでした。 #!/usr/bin/perl open(OUT,">/home/test/test.log"); print OUT "OK"; close(OUT); このスクリプトをcrontabに以下のように記述しました。 0 0 * * * /home/test/test.pl > /dev/null 2>&1 パーミッションは省略します。 このようにすると、正常にtest.logが出力されました。 しかし、本当に実行したいスクリプトを同様にしたところ、 正常に動作しませんでした。cronログには記録されます。 実際のスクリプトは長いのでここには掲載できませんが、 主な処理はおおよそ次のようなことをしています。 ・pmとplモジュールがあり、plからpmを呼び出している。 ・plもpmも自作のユーザ関数の組み合わせ ・ファイルはtestユーザが所有し、実行権限は777。  (動作確認後、徐々に落としていきます) ・plでは、use encoding 'utf8'。 ・スクリプトにオプションを付けて、引数を読み込む。 ・loggerでsyslogへ結果を出力。 ・子プロセスを生成して処理の一端を行わせている。 ・opendir、readdirなどを使用。 ・xxxxxx.datファイルを読み書きしている。 ・CPANにあったメール送受信モジュールを使用している。 ・ファイルをbz2圧縮している。 などです。 コマンドラインから実行すると確実に正常に動作します。 気になるのはPerlスクリプトの内容でモジュールを使うときは、 パスが通っていてもフルパス指定しないといけないのでしょうか? しかし、フルパスと言ってもせいぜいsystem()で実行するコマンドを フルパスにするくらいしか思いつきません。 うまく実行できない理由として考えられる可能性があることを 教えてもらえませんか? 根本的な解決としては、cronでの実行とコマンドラインからの実行は 何が違うのかが明確になれば対処できるのかもしれません。 よろしくお願いします。

  • C言語のsystem関数でコマンドのエイリアス

    C言語のsystem関数でエイリアスを設定したコマンドを実行する方法、どなたかご存じないでしょうか。 例えばbashを使っているユーザであれば、ユーザのbash_profileの中に alias id='id -g username' と記載し、idコマンドを実施した際には必ずusernameさんのグループIDを出力させるようにします。 この状態で、profileを読み込んでidコマンドを実行すると「500」等のIDが出力されます。 これをCのソースの中にsystem関数として記載します。 勿論ユーザはbashのプロファイルを読み込んでいる状態でgccします。 ソースファイル名をtest.cとすると、test.cのmainは以下 int main(){ system("id"); return 0; } この状態でソースをgccして、実行ファイルを実行しても出力結果は先ほどのグループIDのみではなく標準的なid,つまり uid=0(root) gid=0(root) 所属グループ=0(root),1(bin),2(daemon),3(sys) 以下省略 と出力されていしまいます。 やりたい事はエイリアスを設定したコマンドをCのsystem関数で使いたいのですが、どなたかやり方ご存知の方いらっしゃいますでしょうか。 使用しているOSはLinuxです。 どうぞ宜しくお願い致します。

  • PERLからcshellを実行したいのですが

    PERLからcshellを実行したいのですが、UNIXのコマンドラインから直接実行すると上手く行くのですが、ブラウザからでは欲しい結果が表示されず、ログにも何も残りません。 $ret = system ("/bin/csh /home/my47143/.www/test.csh $argv1"); #$ret = 265/ 265 = 1 戻り値は1、いろいろ調べてみてLANG をCに指定して、パーミションも全て777にしてあります。 シェルの内容は、SQLをしてその結果をtest.logに書き込み、後に同じCGIの中で読み込み標準出力をしています。 open( TEXTFILE, "<test.log" ); $line = <TEXTFILE>; print $line; @lines = <TEXTFILE>; foreach ( @lines ) { print $_; } close( TEXTFILE ); コマンドラインから実行すれば、ちゃんとtest.logに結果が書き込まれています。 この書き込まれた結果をそのままにしておけば、ブラウザにその結果も表示されます。 ですが、シェルで引数で渡す度に結果は上書きするはずなのですが、シェルが実行されている気配がありません。 なんででしょうか?教えてください。

  • Perlでpopen()的なものを使って・・

    今Perlでちょっとしたアプリを作っています。 サーバはunix系でアプリの内容はコマンドの結果値をHTMLで表示させるというものです。 一度Cで作って成功しました。 簡単に書きます。(HTMLの表示部分は簡略します) int main() { char *token; char str[1024]; FILE *fp = popen("ls -la","r"); while(fgets(str,1024,fp)!=NULL){ token = strtok(str,NULL); printf("結果:%s\n",token); } exit(0); } とコマンド(例:ls -la)を実行してファイルハンドルを返してコマンドの結果値を読み取って表示させるというものなのですが、これをPerlに移行したいと考えています。 Perlをさわるのが初めてでしてネットで調べてみても なかなか参考になるものはありません。 Perlの関数にpopen()が存在するのかまたfgets()、strtok()に類似する関数がありましたらアドバイスいただけないでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • Perl から csh 実行

    やまとです。 いつもありがとうございます。 Perl + csh を同時(?)に実行する方法を教えてください。 OSはSunです。 具体的にどのような処理を行いたいか簡単に説明しますと。 1.Perlでcshを実行(system関数?)し、cshで環境変数をセット(source)する。 2.cshで環境変数をセットしたら、ファイルを出力する処理が行われます。 3.Perlでcshによって出力されたファイルの内容を画面に表示します。 以下ソースを掲載します。(抜粋して) ================================================== = Perl ( test_perl.pl ) $data = "ABC"; $ret = system(`test_csh.sh $data`); ・ ・ ファイル(test.log)を開き、読込、画面に表示します(まだ作成してません。) ================================================== = Csh ( test_csh.sh ) source test_source.sh echo $1 > test.log ================================================== = test_source.sh setenv CLASSPATH .:/aaa・・・・・・ ↑ PATHの設定を行ってます。 ================================================== 画面に、「ABC」と出力させたいのです。 Perlからcshが実行されていないように思えるのですが、 Perlのsystem関数の使い方が誤っているのでしょうか? それとも、ClassPath等の設定をしなければならないのでしょうか? ちなみにコマンドから、 # test_csh.sh ABC と実行しますと、ファイルが出力され、かつ、sourceも実行されています。 Perlから実行する方法を教えてください。 説明が不十分であれば、補足いたしますのでご指摘ください。 宜しくお願いします。

    • ベストアンサー
    • Perl
  • cgi(perl)からphp呼出

    どなたかご教授ください。 perlのcgiからsystem関数でphp(コマンドで実行可能なコード)を実行して返値を得たいのですが perlのcgiの実行結果では画面に文字化けを起こしたような結果が帰ってきます。 cgi(perl)からphpを実行するにはどのように すればいいのでしょうか? ご教授ください。

    • 締切済み
    • PHP

専門家に質問してみよう