[php kernel]----ファイルシステム関数が通常のファイルに使用される場合のいくつかの状況_PHP チュートリアル

WBOY
リリース: 2016-07-13 17:46:44
オリジナル
1413 人が閲覧しました

今日、同僚と fflush 関数の役割について議論しました。私は、PHP のファイル システム機能はシステムの標準 I/O ライブラリ上に構築されるべきだと考えました。そのため、fflush の関数はバッファをフラッシュすることであると勝手に信じていました。標準 I/O ライブラリの fflush 関数に相当します....

後でコードをトレースしたところ、結果が大きく異なることがわかりました...

まずは結果について話しましょう:

1. PHP のファイルシステム関数(fopen、fwrite、fread、fseek など)を通常のファイルに適用すると、内部では open、write、read、seek などのシステムコールが使用され、システムコールを経由せずに処理されます。標準 I/O ライブラリ。

2. fflush 関数は、通常のファイルに適用しても効果がありません。

追跡プロセス:

ext/standard/file.c の

から

PHP_NAMED_FUNCTION(php_if_fopen)

エントリポイントとして、最後に main/streams/plain_wrapper.c で次の定義を見つけます

PHPAPI php_stream_ops php_stream_stdio_ops = {

php_stdiop_write、php_stdiop_read、

php_stdiop_close、php_stdiop_flush、

「STDIO」、

php_stdiop_seek、

php_stdiop_cast、

php_stdiop_stat、

php_stdiop_set_option

};

これは、通常のファイルに適用される主要なファイル システム関数の基礎となる実装です

例として php_stdiop_flush (PHP ユーザー モードの fflush に相当) を取り上げます。

static int php_stdiop_flush(php_stream *stream TSRMLS_DC)

{

php_stdio_stream_data *data = (php_stdio_stream_data*)stream->abstract;

アサート(データ!= NULL);

/*

* stdio は fflush(3) を呼び出すことでデータをユーザーランドにバッファーします。

* データは write(2) を使用してカーネルに送信されます。

* 全く違うものです

*/

If (データ->ファイル) {

return fflush(data->file);

}

0 を返す

}

通常のファイルの初期化プロセス中 (オープンプロセスを追跡するとわかります)、data->file フィールドは設定されませんが、data->fd が使用されます。

したがって、fflush はここでは呼び出されません。つまり、fflush が通常のファイルで使用されても効果はありません。

著者: selfimpr メール: lgg860911@yahoo.com.cn

http://www.bkjia.com/PHPjc/478561.html

www.bkjia.com

tru​​e

http://www.bkjia.com/PHPjc/478561.html技術記事今日、fflush 関数の役割について同僚と議論しました。PHP のファイル システム機能はシステムの標準 I/O ライブラリ上に構築されるべきだと考えました。そのため、fflush の役割は標準を更新することであると勝手に考えていました。 ...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート