きくたにです。 もはや独り言モードなので読み飛ばしてください。 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/