快速业务通道

Linux文件操作里神秘的当前指针

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-03-26

在《Unix/Linux编程实践教程》一书第56页有一段话:

Unix每次打开一个文件都会保存一个指针来记录文件的当前位置,如图示

read从当前位置读入指定长度的数据,

然后移动当前位置指针,

指向下一个未读的数据

当从文件读数据时,内核从指针所标明的地方开始,

读取指定的字节,然后移动位置指针,

指向下一个未被读取的字节,写文件的操作也是类似的.

指针是与文件描述符相关联的,而不是与文件关联,

如果两个程序同时打开一个文件,这时会有两个指针,

两个程序对文件的读操作不会互相干扰.

要接开文件当前指针的面纱,定位它,有个方法:

使用off_t oldpos = lseek(int fd,off_t dist, int base)函数可以返回当前位置——lseek(fd, 0, SEEK_CUR),SEEK_CUR这个参数标明,在当前指针的位置做零位移,返回的同样是当前指针位置.

借书中的例子结合这个函数,查看文件打开时当前指针的移动动向:

#include <stdio.h>
#include
<utmp.h>
#include
<fcntl.h>
#include
<unistd.h>

int main()
{
struct utmp current_record;
int utmpfd,currfd;//文件描述符,当前指针
int reclen = sizeof(current_record);
if((utmpfd=open(UTMP_FILE, O_RDONLY)) == -1){
perror(UTMP_FILE);
exit(
1);
}
currfd
= lseek(utmpfd,0, SEEK_CUR);
printf(
">utmpfd=%d,currfd=%d,sizeof(utmp)=%d\n",utmpfd,currfd,sizeof(struct utmp));
while(read(utmpfd, &current_record, reclen) == reclen)
{
currfd
= lseek(utmpfd,0, SEEK_CUR);
printf(
">utmpfd=%d,currfd=%d\n",utmpfd,currfd);
show_info(
&current_record);
}
close(utmpfd);
return 0;
}
show_info(
struct utmp *utbufp )
{
printf(
"%-8.8s", utbufp->ut_name); /* the logname */
printf(
" "); /* a space */
printf(
"%-8.8s", utbufp->ut_line); /* the tty */
printf(
" "); /* a space */
printf(
"ld", utbufp->ut_time); /* login time */
printf(
" "); /* a space */
#ifdef SHOWHOST
printf(
"(%s)", utbufp->ut_host); /* the host */
#endif
printf(
"\n"); /* newline */
}

这段代码,原是读取utmp文件,该文件记录了用户登录详细信息,逐条读取utmp结构体大小的数据(utmp结构体成员包含登录信息),理论上来讲,每次read大小为utmp结构体的数据后后,当前指针都应该后移utmp结构体大小,那么查看一下结果是不是呢?

view sourceprint?
>utmpfd=3,currfd=0,sizeof(utmp)=384
>utmpfd=3,currfd=384
reboot ~ 1315959413
>utmpfd=3,currfd=768
runlevel ~ 1315959413
>utmpfd=3,currfd=1152
LOGIN tty4 1315959413
>utmpfd=3,currfd=1536
LOGIN tty5 1315959413

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号