In message <_A56@delegate-ja.ML_> on 05/22/07(22:54:10) you Katsuaki Shimadera <pe4aabrv6-mxhgu46bjwxw.ml@delegate.org> wrote: |goikenの方に送った方がよかったですね。 |すみません。 いえいえ。。。 goiken (DeleGate-ML) のほうは、アナウンス用だけに使うのが良いかも知れない と思う今日このごろです。 |Solarisのfreadの動作は気持ち悪いですね。 |勉強になりました。 わたしはどうもすっきりしなかったので、テストプログラム(同封の、nbio-test.c) を作って調べてみましたら、 ・Solarisでは、non-blocking な (socketではなく) pipe に対する fread が異常 だということがわかりました。 % cc nbio-test.c -o nbio-test -lnsl -lsocket % nbio-test Non-blocking read: ON Type: pipe written A 2 fread(4)=2 feof()=16 errno=0 // pipe では不完全freadで feof() が立つ written B 2 % nbio-test -s ## pipe の変わりに socket を使用 Non-blocking read: ON Type: socket written A 2 fread(4)=2 feof()=0 errno=0 // socket なら問題なし written B 2 これは、他のOSでは pipe でも socket でも、feof() にはならず、そのかわり errno==EAGAIN になります。例えば Linux では、 Non-blocking read: ON Type: pipe written A 2 fread(4)=2 feof()=0 errno=11 - fread: Resource temporarily unavailable written B 2 OSによっては、pipe が socket よりリソースを食うことが考えられますし、 Windows では socket の fdopen はできません。 ですので、9.6.1 での対処方法としては、 ・Solarisでは、pipe ではなく socket で、gunzip スレッドとDeleGateをつなぐ ということにします (http.c)。 これで、Solarisでも non-blocking fread 使用の利点を殺さずに済みます。 ようやく、すっきりしました(^^) |私のSolaris環境でのDeleGate使用は個人用途ですので急いではいないです。 |最近は仕事でもLinuxを使うことが多いです。 最近はテストやバイナリ配布のためにFedora Coreとかも含めて10種類以上の LinuxやらFreeBSDやらSolarisやらを(VMWareやらVirtualPCやらの上で) インストールして使ってはいるのですが、いずれも、MacOSXに較べると ないともわびしい感じで... :p MacOSXが Apple のマシン以外でも使えるなら、もう絶対 MacOSX がいいと 思うんですけどねぇ:) 9 9 ┌─┐┬┌──┬┐ //\^^ ( e ); {Do the more with the less -- B. Fuller} ├─┤│└─┐│ / 877m\_< >_ <URL:http://www.delegate.org/delegate/> ┴ └┴──┘┴────────────────────────────── 佐藤豊@情報技術研究部門.産業技術総合研究所(独立行政法人) // nbio-test.c ////////////////////////////////////////////////////////// #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <fcntl.h> #include <pthread.h> #include <errno.h> static int bysock = 0; static int bythread = 1; static int nonblock = 1; void sender(int *sv){ int cc; cc = write(sv[1],"A\n",2); printf(" written A %d\n",cc); sleep(2); cc = write(sv[1],"B\n",2); printf(" written B %d\n",cc); } void *receiver(void *arg){ int *sv = (int*)arg; FILE *in; char buf[4]; int fl,cc; sleep(1); if( nonblock ){ fl = fcntl(sv[0],F_GETFL,0); fl |= O_NDELAY; fcntl(sv[0],F_SETFL,fl); } in = fdopen(sv[0],"r"); cc = fread(buf,1,sizeof(buf),in); printf(" fread(%d)=%d feof()=%d errno=%d\n", sizeof(buf),cc,feof(in),errno); if( errno ) perror(" - fread"); } int main(int ac,char *av[]){ int ai,sv[2]; pthread_t tid; void *stat; for( ai = 1; ai < ac; ai++ ){ if( strcmp(av[ai],"-s") == 0 ) bysock = 1; else if( strcmp(av[ai],"-b") == 0 ) nonblock = 0; else if( strcmp(av[ai],"-p") == 0 ) bythread = 0; } printf("Non-blocking read: %s\n",nonblock?"ON":"OFF"); printf("Type: %s\n",bysock?"socket":"pipe"); if( bysock ) socketpair(AF_UNIX,SOCK_STREAM,0,sv); else pipe(sv); if( bythread ){ pthread_create(&tid,NULL,receiver,sv); }else{ if( fork() == 0 ){ receiver(sv); exit(0); } } sender(sv); if( bythread ) pthread_join(tid,&stat); else wait(0); return 0; } ///////////////////////////////////////////////////////////////////////// *** ../dist/src/delegate9.6.0/src/http.c Sun May 20 13:57:18 2007 --- src/http.c Wed May 23 06:42:16 2007 *************** *** 2994,2999 **** --- 2994,3004 ---- if( 1 /* KeepAlive or chunked or Socket/Win */ ){ /* if( RX_fsx.t_keepAlive || RX_fsx.t_chunked ){ */ + int IsSolaris(); + if( IsSolaris() ){ + /* 9.6.1 for non-blocking fread() on Solaris */ + Socketpair(mio); + }else pipe(mio); mofp = fdopen(mio[1],"w"); setbuffer(mofp,NULL,0);