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
相关文章:

简单有趣的matlab小程序_超实用有趣的五个小程序推荐
大家好,我是小胖。废话不多说,进入正题。1.一周CP共读有趣的灵魂总会相遇。一个极简的社交小程序。通过选择自己喜欢的一本书,匹配到那个跟自己有着一样有趣灵魂的TA。选择好要阅读哪本书之后,填写下资料,就能在看一本…

一些linux下的性能监测工具
1.gprof http://blog.csdn.net/stanjiang2010/article/details/5655143 2.系统性能调优 http://www.ibm.com/developerworks/cn/linux/l-time/part2/index.html?cadrs perf http://www.ibm.com/developerworks/cn/linux/l-cn-perf1/ oprofile http://www.ibm.com/developerwor…

uva 10183 How many Fibs?
数学题: 给你一个区间[a,b]在该区间内有多少个费波那列数(包括a,b),数据规模达到10^100。 这题的原理很简单,基本没什么算法,其实更偏重于编程能力,需要用到高精度。另外找区间的地方…

2018/11/29 一个64位操作系统的设计与实现 02 (安装nasm)
操作系统: Centos7 在nasm官网上的到通过yum安装nasm的方法 首先在/etc/yum.repos.d/目录下 新建一个名为nasm.repo的文件, 在这么文件中写入内容如下 : [nasm] nameThe Netwide Assembler baseurlhttp://www.nasm.us/pub/nasm/stable/linux/ enabled1 gpgcheck0[nasm-testing]…

a-awk 计算数值最大,最小,平均值并保留指定位数
awk 计算最大值 echo -e "1\n2\n3\n10\n9\n5\n11\n"|awk BEGIN {max 0} {if ($1>max) max$1 } END {print "Max", max} 输出为:Max 11 或者可以使用sort命令更为便捷: cho -e "1\n2\n3\n10\n9\n5\n11\n"|sort -n |tai…

第18章:MYSQL分区
第18章:分区 目录 18.1. MySQL中的分区概述18.2. 分区类型18.2.1. RANGE分区18.2.2. LIST分区18.2.3. HASH分区18.2.4. KEY分区18.2.5. 子分区18.2.6. MySQL分区处理NULL值的方式18.3. 分区管理18.3.1. RANGE和LIST分区的管理18.3.2. HASH和KEY分区的管理18.3.3. 分…

mysql属性配置提高查询_MYSQL性能优化-安装时优化参数配置提高服务性能
MYSQL性能优化一直是个头痛的问题,目前大多都是直接把页面html静态页面或直接使用了缓存技术,下面我就mysql本身的性能优化来分享一下。安装时优化参数配置提高服务性能在Linux下安装Mysql采用默认配置安装的Mysql却未必是工作在最佳性能状态的ÿ…

c++引用的自我见解
2019独角兽企业重金招聘Python工程师标准>>> 刚开始学习c 学完指针后,其细节比较好明白,但学到引用了以后,只知其表却不知其底层的实现机制,虽然知道引用是别名、声明必须同时初始化等等,但这只是概念性的东…

c# yield关键字原理
https://www.cnblogs.com/blueberryzzz/p/8678700.html c# yield关键字原理详解 1.yield实现的功能yield return:先看下面的代码,通过yield return实现了类似用foreach遍历数组的功能,说明yield return也是用来实现迭代器的功能的。 using st…

linux进程间通信:命名管道FIFO
文章目录FIFO 通信特点系统调用接口应用拥有亲缘关系之间的进程通信非亲缘关系进程之间的通信总结FIFO 通信特点 FIFO文件有文件名 可以像普通文件一样存储在文件系统之中可以像普通文件一样使用open/write读写和pipe文件一样属于流式文件,不…

mysql 账户管理_如何用MySQL 命令来实现账户管理
今天我们要学习的是如何用MySQL 命令的方式来对账号进行管理,我们大家都知道在实际应用中MySQL 命令可以完成多种任务,以下的文章主要是对用MySQL 命令的方式来对账号进行管理的具体内容介绍。手册上说 “GRANT语句允许系统管理员创建MySQL用户账户&…

Can't connect to MySQL server on '127.0.0.1' (10061) (code 2003)解决方法
先验证一下MySQL的服务是否开启,到计算机->管理->服务和应用程序->服务 如果服务已开启,就检查一下C:\WINDOWS\system32\drivers\etc目录下的hosts文件, 是否存在这一下,不存在添加。 最后在mysql的配置文件my.ini中[mys…

学习MongoDB (1) :配置安装
为什么80%的码农都做不了架构师?>>> MongoDB是一种强大、灵活、可扩展的数据存储方式。它扩展了关系型数据库的众多有用的功能,如辅助索引、范围查询、排序。 最近开始在Windows 32位平台下研究MongoDB的使用,为了方便ÿ…

跨域策略文件crossdomain.xml文件
使用crossdomain.xml让Flash可以跨域传输数据 一、crossdomain.xml文件的作用 跨域,顾名思义就是需要的资源不在自己的域服务器上,需要访问其他域服务器。跨域策略文件是一个xml文档文件,主要是为web客户端(如Adobe Flash Player等)设置跨…

linux进程间通信:FIFO应用 /var/log/ 系统日志的模拟实现
在类unix操作系统下存在这样一个目录/var/log/,主要是记录操作系统相关的系统各个进程服务的日志信息 该日志系统的特性如下: 支持多进程并发写入同一文件不同进程日志信息可以写入不同文件支持使用head/tail/grep/cat/vi 等命令进行日志操作 我们可以…

context.xml mysql_在tomcat下context.xml中配置各种数据库连接池(示例代码)
Tomcat6的服务器配置文件放在 ${tomcat6}/conf 目录底下。我们可以在这里找到 server.xml 和 context.xml。当然,还有其他一些资源文件。但是在在本文中我们只用得上这两个,其他的就不介绍了。1,首先,需要为数据源配置一个JNDI资源。我们的数…

Planetary.js:帮助你构建超炫的互动球体效果
Planetary.js 是一个 JavaScript 库,用于构建互动球体效果。它使用 D3 和 TopoJSON 解析和渲染地理数据。Planetary.js 采用了基于插件的架构,即使是默认的功能是作为插件实现的,这使得 Planetary.js 非常灵活。Planetary.js 是完全可定制&am…

JAVA条件表达式的陷阱
Map<String, Integer> map new HashMap<String, Integer>(); map.put("count", null); Integer it map null ? 0 : map.get("count"); 注意:在第三行,会抛出java.lang.NullPointerException信息。因为分析&…

腾讯Bugly异常崩溃SDK接入
首先登入Bugly,创建应用,记录下AppId ①下载SDK,通过Cocoapods集成 pod Bugly #腾讯异常崩溃日志服务 ②导入头文件,并初始化 /** 腾讯Bugly */#import <…

linux进程间通信:FIFO实现进程间的双向通信
fifo的双向通信的方式如下图: 两个进程间的通信需要两个命名管道,分别处理一个进程的读和写 导致这种通信方式出现的根因还是由于fifo的阻塞读和阻塞写,所以这里需要使用两个管道对读写进行分别处理。 同时因为管道传输的数据为流式数据&…

load python txt文件_详解Python中numpy.loadtxt()读取txt文件
为了方便使用和记忆,有时候我们会把 numpy.loadtxt() 缩写成np.loadtxt() ,本篇文章主要讲解用它来读取txt文件。读取txt文件我们通常使用 numpy 中的 loadtxt()函数numpy.loadtxt(fname, dtype, comments#, delimiterNone, convertersNone, skiprows0, usecolsNone…

线程之线程标识
就像每个进程有一个进程ID一样,每个线程也有一个线程ID。进程ID在整个系统中是唯一的,但线程ID不同,线程ID只在它所属的进程环境中有效。 进程ID,用pid_t数据类型来表示,是一个非负整数。线程ID则用pthread_t数据类型来…

Tab Bar Animation
2019独角兽企业重金招聘Python工程师标准>>> 自定义UITabBar。自定义Tab Bar切换过程中的动画效果。用户点击某个Tab,一个小箭头会从之前的Tab上面移动到当前点击的Tab上面。可以在tab上面加上小箭头用于显示当前处于哪个tab。 Code4App编译测试…

CynosDB技术详解——存储集群管理
本文由腾讯云数据库发表 前言 CynosDB是架构在CynosFS之上的分布式关系数据库系统,为最大化利用存储资源,平衡资源之间的竞争,检查资源使用情况,需要一套高效稳定的分布式集群管理系统(SCM: Storage Cluster Manager&a…

linux进程间通信:system V消息队列
文章目录基本介绍编程接口代码实例消息队列的发送和接收消息队列中的消息对象的属性控制基本介绍 支持不同进程之间以消息(messages)的形式进行数据交换,消息能够拥有自己的标识,且内核使用链表方式进行消息管理。进程之间的通信…

将一个一维数组转化为二进制表示矩阵。例如_算法之矩阵最大区域问题
例如:给定一个m*m(0<n)的矩阵,请找到此矩阵的一个子矩阵,并且此子矩阵的各个元素的和最大,输出这个最大的值。或者给出一个柱形矩阵求最大子矩阵的最大值。首先我们需要了解一下最大字段和问题。最大子段和问题给定一个长度为n…

伪元素first-letter
用于设置一个块级元素首位字符的样式,而且仅对该字符设置样式 p:first-letter{ font-size:200%}是让P中的第一个字符是其他字符大小的两倍转载于:https://www.cnblogs.com/damade/p/3518583.html

fedora17 的 rc.local
Fedora17上已经找不到/etc/rc.local了,如果我们想开机执行某个脚本,就需要手动创建这个文件,目录也发生了小小变化: 1. 新建文件/etc/rc.d/rc.local,第一行须指明执行shell: [root www.linuxidc.com rc.d]#…

使用TortoiseGit,设置ssh方式连接git仓库。
开始设置之前的准备:建立项目文件夹,初始化git仓库(右键 git init),右键打开 git bash ,git pull “仓库地址”, 把网站上的仓库代码拉取下来。 TortoiseGit使用扩展名为ppk的密钥,而不是ssh-keygen生成的rsa密钥。 也…

linux进程间通信:消息队列实现双端通信
双端通信描述 利用消息队列针对发送接受消息的类型唯一性 进行多个客户端之间消息传递,而不需要server端进行消息转发。 同时消息队列的读阻塞和写阻塞特性(消息队列中已经写入数据,如果再不读出来,则无法再次写入)让…