文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>标准函数库和系统调用

标准函数库和系统调用

时间:2006-06-16  来源:wxgchinaunix

今天写代码时遇到了一个问题,费了好大的精力。有两个函数:main()是测试函数;addLog()函数往磁盘添加一个记录文件。简单叙述如下:
#include <stdio.h>
int main(int argc, char *argv[]){
    ...
    addLog(0x01, sta);    //sta为一个结构体
    if(fread(&ev, sizeof(struct event), 1, fp) != 1){
         ...
    }
    //ev为一个事件结构体
    ...   
}

void addLog(int code, struct status sta){
    ...
    if(fwrite(&ev, sizeof(struct event), 1, fp) != 1){
         ...
         ...
    }
    ...
    fclose(fp);
}

    在main()和addLog()都是对同一个文件操作001.log。结果在main()里的fread()老是返回错误的数据。问题就出在标准函数库的函数是带缓冲区的。我原来也考虑到这个问题。我记得fclose()会调用fflush(),结果没有。还是得手动在fclose()之前调用fflush(),这样才强迫数据写到文件中(当然了,只是写到内核的缓冲区)才能返回正确结果。

    说到这里就说说标准库函数和系统调用的区别和联系。大部分的标准库函数都有一个同名的系统调用。标准库函数是调用系统调用来实现的。不同的是标准库函数带了个缓冲区,这样可以减少系统调用的次数。因为系统调用是很浪费时间的。要从用户空间拷贝数据到内核空间,进行了空间切换。

    标准库函数最容易让人迷惑的也就是这个缓冲区了。详细的信息大家可以看《unix环境高级编程》,这可是unix编程的圣经。 

相关阅读 更多 +
排行榜 更多 +
球我归位手机版

球我归位手机版

休闲益智 下载
进击小巨人最新版

进击小巨人最新版

冒险解谜 下载
吞就完了手机版

吞就完了手机版

冒险解谜 下载