Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
269 views
in Technique[技术] by (71.8m points)

文件协程fseek ftell 文件大于2G bug

启用文件协程后对于大于2G的文件fseek 和ftell 会造成错误

<?php
SwooleRuntime::enableCoroutine();
Co
un(function () {
    $fp=fopen("/tmp/555","r+");
    fseek($fp,2147724448,SEEK_SET);
    echo ftell($fp);    
});

输出结果:
-2147242848

修改 plain_wrapper.c 389行

if (data->fd >= 0)
    {
        zend_off_t result;
        //result = lseek(data->fd, offset, whence); 此行 lseek修改为lseek64 重新编译
        result = lseek64(data->fd, offset, whence);
        if (result == (zend_off_t) -1)
            return -1;

        *newoffset = result;
        return 0;

    }

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

实际上,以 32位无符号整数来看, -21472428482147724448 相等。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...