标准函数库和系统调用
时间: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为一个事件结构体
...
}
#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编程的圣经。
相关阅读 更多 +