linux 系统调用 read,write和lseek 使用
read系统调用
- 头文件
#include <unistd.h>
- 函数使用
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 <unistd.h>
- 函数使用
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 <unistd.h>
#include <sys/types.h>
函数使用
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 <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <string.h>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 \n",20) //写入20个字符串printf("you have writed %d words to the buffer and off is %d\n",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\n",k);size_t t = read(fd,buf,20);printf("you have read %d words and %s content\n",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 \n”
you have read 10 words and hello content
[root@localhost ~]# cat write.test
my name is hello
linux 系统调用 read,write和lseek 使用相关推荐
- Linux系统调用之lseek函数
前言 如果,想要深入的学习Linux系统调用函数lseek了话,还是需要去阅读Linux系统中的帮助文档的. 具体输入命令: man 2 lseek 即可查阅到完整的资料信息. lseek函数 lse ...
- 什么是Linux系统调用system call?(Linux内核中设置的一组用于实现各种系统功能的子程序)(区别于标准C库函数调用)核心态和用户态的概念、中断的概念、系统调用号、系统调用表
文章目录 什么是系统调用? 为什么要用系统调用? 系统调用是怎么工作的? 如何使用系统调用? _syscall*()是什么? errno是什么? 调用性能问题 Linux系统调用列表 进程控制 文件系 ...
- Linux系统调用相关概念
目录: 1. Linux系统调用原理 2. 系统调用的实现 3. Linux系统调用分类及列表 4.系统调用.用户编程接口(API).系统命令和内核函数的关系 5. Linux系统调用实例 6. Li ...
- linux close 头文件,Linux open close read write lseek函数的使用
我们经常需要在Linux中进行文件操作,今天我就来分享下文件操作用到的一些函数 1 open 所需头文件: 函数原型:int open(const char *pathname,flags,int p ...
- Linux系统调用表:x86和x86_64
<Linux系统调用表> <linux系统调用表(system call table)> <线上环境 Linux 系统调用追踪> <Linux系统调用权威指南 ...
- Linux系统调用表(system call table)
<Linux系统调用表> <linux系统调用表(system call table)> <线上环境 Linux 系统调用追踪> <Linux系统调用权威指南 ...
- [Linux]Linux系统调用列表
本文列出了大部分常见的Linux系统调用,并附有简要中文说明. 以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数.这可能是你在互联网上所能看到的唯一一篇中文注释的 ...
- Linux系统调用详解(实现机制分析)--linux内核剖析(六)
本文介绍了系统调用的一些实现细节.首先分析了系统调用的意义,它们与库函数和应用程序接口(API)有怎样的关系.然后,我们考察了Linux内核如何实现系统调用,以及执行系统调用的连锁反应:陷入内核,传递 ...
- Linux 系统调用的本质
简单概念 fd #include <unistd.h> #include <string.h>int main(int argc,char* argv[]) {char buf ...
最新文章
- 人脸对齐--Dense Face Alignment
- 图神经网络GNN预训练技术进展概述
- 编译与部署dubbo管控平台dubbo-admin
- LVS+Keepalived-DR模式负载均衡高可用集群
- 求最大元最小元极大元极小元_极大元、最大元.ppt
- oracle删错表了怎么办,Oracle中表被删除或数据被错误修改后的恢复方法
- 成都两年JAVA工程师_成都Java工程师学习路线
- mysql导出表结构_mysql导入导出表结构及表数据及执行sql文件
- 如何看别人网络下计算机,如何查看电脑是否被他人偷偷使用过网络技巧 -电脑资料...
- 汽车维护管理软件开源_感谢开源和自由软件维护者的10种方法
- linux openssh升级7.4,RHEL Centos上升级OpenSSH7.4p1
- 反序列化对象列表发生异常_面试官:你知道Java对象的序列化与反序列化背后的原理吗?...
- 如何应用Matlab plot画点
- oracle扩容临时表空间,oracle临时表空间扩容
- Anaconda Clean命令
- 蓝牙sbc怎么解决_蓝牙耳机不会挑?蓝牙编解码器了解一下
- 快速故障定位 看联想和Riverbed如何演绎?
- SpringBoot项目运行时出现A cookie header was received警告问题
- 稳踞三大价值高地!昆仑万维角逐AIGC“新大陆”
- 深度学习在语音分离的应用
热门文章
- senfile函数实例的运行过程截图
- 一步一步Asp.Net MVC系列_权限管理总结(附MVC权限管理系统源码)
- 从瀑布模型、极限编程到敏捷开发
- 挨踢人生路--记我的10年18家工作经历 - 后记
- ubuntu中常用指令
- np.dot()运算准则
- 一维卷积filter_从零开始学Pytorch(七)之卷积神经网络
- android java 中文乱码_android读写中文如何避免乱码详解
- java script 6 折线_Java入门第六篇:Java script(js)的事件
- barmanager 不显示_广州13.3寸广告液晶显示屏品牌排行榜