Article delegate-ja/57 of [1-251] on the server localhost:7119
  upper oldest olders older1 this newer1 newers latest
search
[Top/Up] [oldest] - [Older+chunk] - [Newer+chunk] - [newest + Check]
[Reference:<_A56@delegate-ja.ML_>]
Newsgroups: mail-lists.delegate-ja

[DeleGate-Ja] Re: HTTP Proxy でページが途中までしか読み込まれない(EMERGENCY EXIT)
22 May 2007 22:20:48 GMT ysato@delegate.org (Yutaka Sato)
The DeleGate Project

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);

  admin search upper oldest olders older1 this newer1 newers latest
[Top/Up] [oldest] - [Older+chunk] - [Newer+chunk] - [newest + Check]
@_@V