きくたにです。

もはや独り言モードなので読み飛ばしてください。

Fri, Nov 28, 1997 at 04:09:15PM +0900 において
Kikutani Makoto 曰く:

> > 質問その2:
> > ipc-test1.rb のように双方向のパイプ(?)を作るのはPythonではできない
> > そうですが、Cで書くにはどうすればいいのでしょうか?
> 
> こっちはNutshell本のUsing C on the UNIX Systemを見てたら
> 似たよなのがあったので、こうしてみました。

(snip)

> なんか変。
> rubyじゃなくなってすみませんが、Unixプログラムのシロートに
> 教えてやってください。

なるほど、双方向パイプの場合は pipe(2) を二回呼ぶ必要があるのですか。
Python本見てて気付きました。PythonではこのCの方法をそのまま使う
しかないので。

rubyの open("|./ipc1.rb", "r+") の記法は楽でいいですね。
これはPerlからの継承?


#include <stdio.h>
main()
{
   FILE *fpw, *fpr;
   int pid, pipefds1[2], pipefds2[2];
   int i[1];
   char resp[5];

   pipe(pipefds1);
   pipe(pipefds2);

   pid = fork();

   if (pid == 0) { /* child */
      close(pipefds1[0]);
      close(pipefds2[1]);
      dup2(pipefds2[0], 0);
      dup2(pipefds1[1], 1);
      execl("./ipc1.rb", "ipc1.rb", 0);
      exit(1);
   }
   /* parent */
   close(pipefds1[1]);
   close(pipefds2[0]);
   fpr = fdopen(pipefds1[0], "r");
   fpw = fdopen(pipefds2[1], "w");

   i[0] = 0x12345678;
   fwrite(i, sizeof(int), 1, fpw);
   fflush(fpw);
   fread(resp, sizeof(char), 2, fpr);
   resp[2] = '\0';
   fprintf(stderr, "ipc-test1.c: %s\n", resp);
   fwrite("ruby", sizeof(char), 4, fpw);
   fflush(fpw);
   fread(resp, sizeof(char), 2, fpr);
   resp[2] = '\0';
   fprintf(stderr, "ipc-test1.c: %s\n", resp);

   exit(0);
}

-- 
人生を背負い投げ

菊谷 誠(Kikutani Makoto)  kikutani / eis.or.jp kikutani / jdc.ericsson.se
hgf03701 / niftyserve.or.jp    http://www.eis.or.jp/muse/kikutani/