!!!match.c *2つの対戦プログラムをそれぞれ子プロセスとして起動. *子プロセスは賭金を標準出力に書き出すので,それをパイプから読み出す. *相手の賭金をパイプに書き出す.子プロセスはそれを標準入力から読む. *システムコールdup2を用いてパイプと標準入出力の入れ替えを行っている. *子プロセスが異常終了したり,ハングアップしたときのために,シグナルを受け取ったら,子プロセスをkillする. *これをしないと,子プロセスがゾンビとなって永久に動き続ける. #include #include #include #include #include #define BUFSIZE 256 int sum1=0,sum2=0; int point1=0,point2=0; int p_to_c1[2],c1_to_p[2]; int p_to_c2[2],c2_to_p[2]; char buf[BUFSIZE]; int win1=0,win2=0; int pid1=-1,pid2=-1; void exit_program(int code){ if(pid1>=0) kill(pid1,SIGKILL); if(pid2>=0) kill(pid2,SIGKILL); exit(code); } void sig_receive(){ exit_program(EXIT_FAILURE); } void write_int(int fd, int n){ snprintf(buf,BUFSIZE,"%d\n",n); write(fd,buf,strlen(buf)); fsync(fd); } int read_int(int fd){ int i; for(i=0;i %5d %5d\n",i,bet1,bet2,point1,point2); } else if(bet1>bet2){ point2+=bet1+bet2; printf("%2d: %4d [%4d] -> %5d %5d\n",i,bet1,bet2,point1,point2); } else { point1+=bet1; point2+=bet2; printf("%2d: %4d %4d -> %5d %5d\n",i,bet1,bet2,point1,point2); } if(bet1<0){ printf("%2d: %s bet %d.\n",i,argv[1],bet1); exit_program(EXIT_FAILURE); } if(bet2<0){ printf("%2d: %s bet %d.\n",i,argv[2],bet2); exit_program(EXIT_FAILURE); } write_int(p_to_c1[1],bet2); write_int(p_to_c2[1],bet1); } if(sum1!=10000){ printf("%s bet totally %d.\n",argv[1],sum1); exit_program(EXIT_FAILURE); } if(sum2!=10000){ printf("%s bet totally %d.\n",argv[2],sum2); exit_program(EXIT_FAILURE); } if(point1>point2){ printf(" [%5d] %5d\n",point1,point2); printf("%s won.\n",argv[1]); win1++; } else if(point1