[php内核]----文件系统函数用于普通文件时的一些情况
2011-10-27 20:49
579 查看
author: selfimpr
blog: http://blog.csdn.net/lgg201
mail: lgg860911@yahoo.com.cn
今天和同事讨论到fflush函数的作用, 本想php的文件系统函数应该是构建在系统的标准I/O库之上的, 所以, 武断的认为fflush的作用就是刷出标准I/O库的缓冲, 相当于标准I/O库的fflush函数....
后来跟踪了一下代码, 发现结果大相径庭...
先说下结果吧:
1. php中的文件系统函数(fopen, fwrite, fread, fseek等)应用在普通文件上时, 内部使用的是open, write, read, seek等系统调用进行处理, 而没有经过标准I/O库.
2. fflush函数应用在普通文件上时, 不产生任何作用.
跟踪过程:
从ext/standard/file.c中的
这就是应用在普通文件上的主要的文件系统函数的底层实现
以php_stdiop_flush(对应php用户态的fflush)为例:
而普通文件在初始化过程中(跟踪open的过程中可以看到), 是没有设置data->file这个字段的, 而是使用了data->fd....
因此这里fflush不会被调用, 也就是说当fflush用在普通文件时, 无任何效果.
blog: http://blog.csdn.net/lgg201
mail: lgg860911@yahoo.com.cn
今天和同事讨论到fflush函数的作用, 本想php的文件系统函数应该是构建在系统的标准I/O库之上的, 所以, 武断的认为fflush的作用就是刷出标准I/O库的缓冲, 相当于标准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; assert(data != NULL); /* * stdio buffers data in user land. By calling fflush(3), this * data is send to the kernel using write(2). fsync'ing is * something completely different. */ if (data->file) { return fflush(data->file); } return 0; }
而普通文件在初始化过程中(跟踪open的过程中可以看到), 是没有设置data->file这个字段的, 而是使用了data->fd....
因此这里fflush不会被调用, 也就是说当fflush用在普通文件时, 无任何效果.
相关文章推荐
- php入门篇------->PHPCMS 入口文件,自动加载系统函数和URL规则
- sysfs - 用于导出内核对象(kobject)的文件系统
- PHP中一些文件处理函数的使用
- 关于内核挂载文件系统的一些网页,,有空在学习吧
- PHP扩展之文件系统相关函数
- PHP - Manual手册 - Function Reference函数参考 - File System Related Extensions文件系统相关扩展 - Filesystem文件系统 - Filesystem Functions文件系统函数 -
- php 文件系统函数整理介绍
- linux的几个内核镜像格式Image 和 u-boot启动内核和文件系统时的一些环境变量的设置
- PHP 文件系统(PHP 5 Filesystem 函数) 全解析
- php.ini配置文件详解(为了安全,禁止一些高风险的函数)
- MATLAB中nargin函数的用法nargin是用来判断输入变量个数的函数,这样就可以针对不同的情况执行不同的功能。通常可以用它来设定一些默认值。如下例所示: 函数文件 examp.m
- PHP操作文件的一些基本函数使用示例
- PHP - Smarty模板引擎 - Manual手册 - Chapter 7. Built-in Functions第7章 内建函数 - {config_load}用于从一个配置文件加载配置变量到模板中
- 用php 执行PhantomJS文件,php中使用exec,system等函数调用系统命令
- fsck 修复ext3文件系统(用于linux系统时间不对,文件系统信息有错引起的die with exit status等的一些问题)
- PHP 文件系统函数分类总结
- PHP - Manual手册 - 函数参考 - Filesystem 文件系统函数 - file_exists检查文件或目录是否存在
- linux的时间管理(与驱动程序相关,非应用程序使用)内核和普通系统函数和使用c语言库的区别
- PHP文件系统操作常用函数
- PHP - Manual手册 - XL. Filesystem 文件系统函数 - is_dir判断给定文件名是否是一个目录