您现在的位置:计算机技术学习网 > 技术中心 > WEB编程 > PHP >

[php内核]----文件系统函数用于普通文件时的一些情况

来源:未知 责任编辑:责任编辑 发表时间:2014-01-26 21:59 点击:

 

今天和同事讨论到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用在普通文件时, 无任何效果.

 

 

author: selfimpr mail: lgg860911@yahoo.com.cn

    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码:点击我更换图片
    最新评论 更多>>

    推荐热点

    • PHP测试
    • 十天学会php之第六天
    • 几种显示数据的方法的比较
    • 使用xmlhttp为网站增加域名查询功能
    • PHP+MYSQL+Javascript数据库查询结果的动态显示
    • 查找数组中指定键名的值
    • 用redis实现跨服务器session
    • 用新浪微博接口发送图片微博失败的原因
    • smarty局部缓存技术[源码分析]
    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1