当前位置:  技术问答>编程技术其它 iis7站长之家

哪位老大能讲一下lseek函数和dup与dup2函数是干什么用的,最好有实例

    来源: 互联网  发布时间:2016-03-10

    本文导语:  哪位老大能讲一下lseek函数和dup与dup2函数是干什么用的,最好有实例 |      dup(复制文件描述词) 相关函数 open,close,fcntl,dup2 表头文件 #include 定义函数 int dup (int oldfd); 函数说明 dup()用来...

哪位老大能讲一下lseek函数和dup与dup2函数是干什么用的,最好有实例

|
     dup(复制文件描述词)
相关函数 open,close,fcntl,dup2
表头文件 #include
定义函数 int dup (int oldfd);
函数说明 dup()用来复制参数oldfd所指的文件描述词,并将它返回。此新的
     文件描述词和参数oldfd指的是同一个文件,共享所有的锁定、读写
     位置和各项权限或旗标。例如,当利用lseek()对某个文件描述词作
     用时,另一个文件描述词的读写位置也会随着改变。不过,文件描
     述词之间并不共享close-on-exec旗标。
 返回值 当复制成功时,则返回最小及尚未使用的文件描述词。若有错误则
     返回-1,errno会存放错误代码。错误代码EBADF参数fd非有效的文
     件描述词,或该文件已关闭。
     dup2(复制文件描述词)
相关函数 open,close,fcntl,dup
表头文件 #include
定义函数 int dup2(int odlfd,int newfd);
函数说明 dup2()用来复制参数oldfd所指的文件描述词,并将它拷贝至参数
     newfd后一块返回。若参数newfd为一已打开的文件描述词,则newfd
     所指的文件会先被关闭。dup2()所复制的文件描述词,与原来的文
     件描述词共享各种文件状态,详情可参考dup()。
 返回值 当复制成功时,则返回最小及尚未使用的文件描述词。若有错误则
     返回-1,errno会存放错误代码。
附加说明 dup2()相当于调用fcntl(oldfd,F_DUPFD,newfd);请参考fcntl
     ()。
错误代码 EBADF 参数fd 非有效的文件描述词,或该文件已关闭


     lseek(移动文件的读写位置)
相关函数 dup,open,fseek
表头文件 #include
     #include
定义函数 off_t lseek(int fildes,off_t offset ,int whence);
函数说明 每一个已打开的文件都有一个读写位置,当打开文件时通常其读写
     位置是指向文件开头,若是以附加的方式打开文件(如O_APPEND),
     则读写位置会指向文件尾。当read()或write()时,读写位置会随之
     增加,lseek()便是用来控制该文件的读写位置。参数fildes 为已
     打开的文件描述词,参数offset 为根据参数whence来移动读写位置
     的位移数。
  参数 whence为下列其中一种:
     SEEK_SET 参数offset即为新的读写位置。
     SEEK_CUR 以目前的读写位置往后增加offset个位移量。
     SEEK_END 将读写位置指向文件尾后再增加offset个位移量。
     当whence 值为SEEK_CUR 或SEEK_END时,参数offet允许负值的出
     现。
     下列是教特别的使用方式:
     1) 欲将读写位置移到文件开头时:lseek(int
     fildes,0,SEEK_SET);
     2) 欲将读写位置移到文件尾时:lseek(int fildes,
     0,SEEK_END);
     3) 想要取得目前文件位置时:lseek(int fildes,0,SEEK_CUR);
 返回值 当调用成功时则返回目前的读写位置,也就是距离文件开头多少个
     字节。若有错误则返回-1,errno 会存放错误代码。
附加说明 Linux系统不允许lseek()对tty装置作用,此项动作会令lseek
     ()返回ESPIPE。

|
  lseek的例子
统计在一个文件中某个字符串出现了几次

运行要两个参数 第一个参数为字符串 第二为文件名



#include 
#include 
#include 
#include 
#include 
#include 
#include 


int main(int argc, char *argv[])
{
  int len;
  int fd;
  long offset=0;
  char buffer[1024];
  int flag=0;
  
  if(argc!=3)
  {
  printf("Usage: %s "string "filename n",argv[0]);
  return 1;
  }
  
  len=strlen(argv[1]);
  
  if((fd=open(argv[2],O_RDONLY))==-1)
  {
  perror("Cannot open this file");
  return 1;
  }

  while(1)
  {
  if(lseek(fd,offset,SEEK_SET)==-1)
  {
  perror("Cannot move the file pointer");
  return 1;
  }
  
  if(read(fd,buffer,len)0)
  {
  printf("the string %s in  file %s  %d timesn",argv[1],argv[2],flag);
  }
  close(fd);
  return EXIT_SUCCESS;
}



|
lseek函数:
头文件:#include 
原型:  off_t lseek(int fd, off_t offset, int wherece)
使用:主要用于定位“当前文件偏移量”
例子:

off_t currpos;
currpos = lseek(fd, 10, SEEK_CUR);
意思是在当前文件偏移量上加10个字节。

dup和dup2函数:
用途:可以用来复制一个现存的文件描述符。
头文件:#include 
原形:int dup(int fd)
      int dup2(int fd1, int fd2)
若成功则返回新的文件描述符,失败返回-1。


使用:
dup函数复制fd文件描述符,返回一个新的文件描述符,使用这个新的文件描述符,与使用fd有相同的效果。
dup2函数复制文件描述符fd1到文件描述符2中,与dup函数不同之处是可以指定新的文件描述符的号码。如果fd2文件描述符是一个文件打开返回的文件描述符
则先关闭它,在复制。













    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 各位老大,小弟初入linux行业,遇到以下问题,请各位老大解答之~
  • 一个老大男的一个老大难
  • 哪位老大给个linux的交流Q群号啊……
  • 各位老大们,在jbuilder6.0中怎么设置
  • 关于JavaBean 和 Tag 的问题?在线等待,谢谢各位老大的帮忙!!
  • 各位老大,请教一个问题,十万火急!!!
  • 我是新手,各位老大请赐教!
  • 那位老大用C++做unix系统编程啊?谈一下经验
  • 哪位老大有redhat enterprise 3的下载地址?小弟愿奉献100分!!
  • 哪位老大介绍一下linux漏洞的书?
  • 一个虚拟机的问题,哪位老大解答一下?
  • 各位老大,都晒晒您在linux上用的是什么影音播放器?支持图形界面吗?
  • 关于JavaBean 和标签库Tag的问题???在线等待谢谢各位老大的帮助!来者有分!!
  • 急!!!!!! 哪位老大能帮忙找找 getCustomDatum 的替代方法。
  • 各位老大救救我吧,再搞不定我今晚就要通霄了呜呜。。。
  • 各位老大,哪儿有linux最新版下载
  • 各老大:有没有图像放大或压缩算法?或思路?
  • 请各位老大帮帮忙!!!
  • 哪位老大装lids成功过?
  • 各位老大,如何更好的控制JButton,只有21分,都给了


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3