哪位老大能讲一下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。
相关函数 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;
}
统计在一个文件中某个字符串出现了几次
运行要两个参数 第一个参数为字符串 第二为文件名
#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文件描述符是一个文件打开返回的文件描述符
则先关闭它,在复制。
头文件:#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.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。