[PHP-users 3064] Re: mbregex のインストール
Yasuo Ohgaki
php-users@php.gr.jp
Wed, 24 Oct 2001 11:29:48 +0900
大垣です。
Tatsuo Ishii wrote:
> 石井です.
>
>>ご心配は理解しますが、バグでもないという反論をすると、
>>
> [略]
>
>> malloc() が失敗しないというのも、メモリが無かったら
>> そこでプロセスを終了させているのだと思います。
>> (ですから、nullポインタを読み書きして、例外が上がって、
>> 終了しても、たいして変わりが無い??)
>>
>
> たいして変ると思いますよ.だって,「遅かれ早かれnullポインタを読み書き
> して例外が上がる」までに何が起きるか分かりませんし,第一nullポインタを
> 読んだだけでは落ちないハードウェアもあります.その場合,処理が先に進ん
> で悪さをする確率が大きくなります.
>
> どうしてもmallocのエラー処理が面倒くさいというのなら,せめてmallocの中
> でexitすべきだと思います.
>
> ところで,こういうコーディング方針って,PHPの開発者の中では普通なので
> すか?
この変はPostgreSQLと違って、httpdのプロセスが落ちでも「まいいか」
的な作りになっていると思います。(HTTPプロトコルの特性、従来のマル
チプロセスを利用したサーバーが前提なのでこうなっている、と思います)
PHP4.1.0RCのemalloc(_emalloc())では
==========
HANDLE_BLOCK_INTERRUPTIONS();
if (!p) {
fprintf(stderr,"FATAL: emalloc(): Unable to allocate %ld bytes\n",
(long) size);
#if ZEND_DEBUG && defined(HAVE_KILL) && defined(HAVE_GETPID)
kill(getpid(), SIGSEGV);
#else
exit(1);
#endif
HANDLE_UNBLOCK_INTERRUPTIONS();
return (void *)p;
}
===========
メモリが足りなくなると、SIGSEGVするかexit(1)になっているようです。
(この辺コードは良く理解していないので問題ないかも知れませんが、こ
こだけ見ると、特にマルチスレッドサーバー、例えばApache2、では問題
があるように見えます。HDNDLE_UNBLOCK_INTERRUPTIONSマクロ等も見てみ
ないと何とも言えませんが。)
--
Yasuo Ohgaki
yohgaki@dd.iij4u.or.jp
__________________________________________________
Do You Yahoo!?
Yahoo! BB is Broadband by Yahoo! http://bb.yahoo.co.jp/