首页 > linux 系统调用 read,write和lseek 使用

linux 系统调用 read,write和lseek 使用

read系统调用

  • 头文件 #include
  • 函数使用 ssize_t read(int fd, void *buf, size_t count)

    read 函数会从文件描述符fd中读取指定的count长度的内容,并且将读到的结果放入到buf缓冲区中
  • 返回值

    count 读取成功,则会返回读到的字节数

    小于count 表示同样读取成功,只是fd从current offset中并未读到count的字节数

    0 表示读到了文件的末尾

    -1 表示读取失败,可能fd已经关闭,可能读到了一个管道,或者read被内核信号中断

注意:

read操作会从当前文件的文件偏移处进行读取,同时 文件偏移会随着读到的长度进行移动。如果当前文件的偏移地址是在上一个文件的结束,那就无法读到fd中的内容。所以这里如果想要读取文件中的内容,在使用read系统调用之前需要重新设置偏移地址lseek

其他详细描述可以参考man 2 read

write系统调用

  • 头文件 #include
  • 函数使用 ssize_t write(int fd, const void *buf, size_t count)

    write函数会向文件描述符fd中写入count bytes的内容,内容的来源是buf
  • 返回值

    count 写入的数据大小 bytes

    0 没有写入任何东西

    -1 表示写入失败

read一样,write也是基于当前文件的偏移地址开始写入,同时文件的偏移随着写入的数据进行移动

其他详细描述可以参考man 2 write

lseek系统调用

  • 头文件

    #include

    #include

  • 函数使用 off_t lseek(int fd, off_t offset, int whence)

    lseek函数会将文件描述符fd所代表的当前文件偏移地址移动指定的偏移量offset,移动方式是通过whence

    其中whence有如下几种:

    a. SEEK_SET 如果offset为0,则读写位置移动到开头。如果不为0,则读写位置在当前位置基础上向前移动offset个字节

    b. SEEK_CUR将读写位置移动到当前位置后再增加offset个字节

    c. SEEK_END 将读写位置移动到文件结尾后再增加offset个字节

  • 返回值

    offset 成功则返回该值。该offset并非参数传入的offset,而是移动偏移量之后 当前偏移量相对于文件开头的偏移量值

    -1 移动偏移量失败

代码案例


#include 
#include 
#include 
#include 
#include int main()
{ int fd;char buf[100];memset(buf,0,sizeof(buf));fd = open("write.test",O_RDWR|O_APPEND); //追加可 读写方式打开了一个文件size_t x = write(fd,"my name is hello 
",20)  //写入20个字符串printf("you have writed %d words to the buffer and off is %d
",x,fd);//close(fd); //此时close,则后续的lseek都返回 -1//如果此时不进行lseek,则后续read读出的buf是空的。lseek此时使用`SEEK_SET`的`whence`,即跳到文件开头进行偏移off_t k = lseek(fd,10,SEEK_SET); printf("The file offset is %d
",k);size_t t = read(fd,buf,20);printf("you have read %d words and %s content
",t,buf);close(fd);return 0;
}

输出如下:

[root@localhost ~]# ./a.out 
you have writed 20 words to the buffer and off is 3
The file offset is 10 //向前移动10个字符,最后读出的内容是 “hello 
”
you have read 10 words and  hello content
[root@localhost ~]# cat write.test 
my name is hello 

更多相关:

  • 本文来自 运维人生 ,作者:fly是个稻草人链接:http://www.ywadmin.com/?id=76误删除linux系统文件了?不用急,本文将给你一个恢复linux文件的方法,让你轻松应对运维中的各风险问题。方法总比问题多~说在前面的话针对日常维护操作,难免会出现文件误删除的操作。大家熟知linux文件系统不同win有回收...

  • 原文来自SecIN社区—作者:WiHat0x00 什么是WebShell渗透测试工作的一个阶段性目标就是获取目标服务器的操作控制权限,于是WebShell便应运而生。Webshell中的WEB就是web服务,shell就是管理攻击者与操作系统之间的交互。Webshell被称为攻击者通过Web服务器端口对Web服务器有一定的操作权限,而...

  • 断电时文件系统发生了什么?硬盘又发生了什么?下一次开机时写到一半的文件在系统层面还在吗?在底层还在吗?更进一步的, 文件系统如何保证事务性, 会不会存在某种极端情况导致例如最后几个bit还没写完, 文件系统却认为它成功了的情况?回答不限任何文件系统,谢谢!下面是「北极」的回复分享断电的一瞬间,很多事情是无法确定的:1. 你无法确定...

  • 接到项目需求。需要搭建一个页面进行交互,慢慢来b (2).jpg使用python django框架进行页面的搭建在项目文件下打开窗口,输入命令;django-admin startproject helloword#在文件helloword/helloword/创建view.py在view.py文件中输入以代码from django....

  • 常见的错误集合解决方案(一)No.1提示错误'Microsoft.VC90.CRT,version="9.0.21022.8"把Microsoft.NET Framework 3.5.1下面的全部勾选上。No.2解决Qt Designer设计的图标但是VS生成不显示问题描述:在Qt designer中为菜单栏和工具栏设计的图标,但是...

  • fifo的双向通信的方式如下图: 两个进程间的通信需要两个命名管道,分别处理一个进程的读和写 导致这种通信方式出现的根因还是由于fifo的阻塞读和阻塞写,所以这里需要使用两个管道对读写进行分别处理。 同时因为管道传输的数据为流式数据,则无法对数据进行指定标记(数据的发送者,接受者,大小。。。)。 SERVER端代码如下: /*...

  • 文章目录介绍重定向函数介绍总结 linux terminal输入如下命令,其中"|"符号即为我们上文中所说的无名管道 介绍 正如我们上文中所描述的"|“无名管道提供了具有亲缘关系的进程之间的通信,它由于直接使用系统调用,运行效率较高。则linux系统下可以大批量的使用”|"来提供命令直接输入输出的重定向。 具体sh...

  • 2019独角兽企业重金招聘Python工程师标准>>> fd_set 结构,是一个数字。 文件描述符fd的值 不能超过1024,而不是数量不能超过1024。 在开发打开句柄多的程序时,最好不要使用select。否则就使用多进程开发。 /usr/include/X11 Xpoll.h 文件 #ifndef _XPOLL_H_#...