【Perl 】初心者コーナーPart5

このエントリーをはてなブックマークに追加
425_gunzip
>>423
んーいまいち具体的に何を知りたいのか見えないけれど、
処理の流れは↓のようになっていることは、知って置いた方がいいかな。

・syswrite()
PerlLIO_write()もといシステムコール
write(int filedes, const void *buff, size_t bytes)
    filedes --> syswriteに渡されたファイルハンドル(から得られるディスクリプタ)
    buff --> syswrite に渡した文字列
    bytes --> 書き込むバイト数(指定されなかった場合Perlが内部で計算する)
を呼び出してその場で書き込む。

・バッファリング無しのprint
PerlIO_write()(≠PerlLIO_write) もといstdioライブラリの
fwrite(const void *ptr, size_t size, size_t count, FILE *fp) に、
    ptr --> print に渡した文字列(ちょっと違う)
    size --> 1 固定だよ
    count --> 文字列長(Perlが内部で計算する)
    fp --> printに渡されたファイルハンドル(から得られるFILE構造体へのポインタ)
を渡して呼び出し書き込むよう指示する。
その後、IOフラグを調べてIOf_FLUSH ビットがセットされていた場合
(つまり、バッファリング無しに設定されていた場合)PerlIO_flush()もとい
stdioのfflush(FILE *fp)を呼んで、まだ書き込んでいないデータをカーネルに渡す。

>後
>書き込んだあと読むために seek で巻き戻すと flush されるようで
いや、そんなことはないと思うが......。たしかdo_seek()はそんなことはしないはず。
>最初からautoflushにする方法しか無いようでした。
IO::Handle を利用して、適宜バッファを書き出したいときに
$io->fflush();
するのが一番スマート && 安全じゃないかな。