linux open write lseek的API和应用
linux下的文件读写
1, open
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
- pathname:文件路径和名
- flags
- 必选项
- O_RDONLY:只读
- O_WRONLY:只写
- O_RDWR:读写
- 可选项
- O_APPEND
- O_CREAT
- O_EXCL
- mode:如果是创建文件,则必须指定文件的权限,最好算出来的权限:mode & ~umask
- 必选项
- 返回值:返回最小的可用文件描述符,失败返回-1,并设置errno
例子:模拟touch命令
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char* argv[]){
int fd = open(argv[1], O_RDONLY|O_CREAT|O_EXCL, 0666);
close(fd);
return 0;
}
0666 & ~0002 = 0664,所以创建出来的文件的权限是:-rw-rw-r--
2,read
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
- fd:文件描述符
- buf:读到哪里
- conut:读多少个字节
- 返回值
- 失败返回-1,并设置errno
- 如果文件描述符是非阻塞的时候,read不到的时候,返回值也是-1,这个-1不代表read失败,所以要判断errno的值,这时errno的值为【11】,用perror打印出的错误信息是【Resource temporarily unavailable】
- 成功返回实际读到的字节数
- 0代表读到文件的末尾了
3,write
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
- fd:文件描述符
- buf:从哪里写
- conut:写多少个字节
- 返回值
- 失败返回-1,并设置errno
- 成功返回实际写出去的字节数
- 0代表什么也没写进去
例子:模拟cat命令
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char* argv[]){
int fd = open(argv[1], O_RDONLY);
char buf[64] = {0};
int ret = 0;
while((ret = read(fd, buf, sizeof buf)) > 0){
write(STDOUT_FILENO, buf, ret);
}
close(fd);
return 0;
}
4,lseek
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
- fd:文件描述符
- offset:偏移的数量
- whence:从哪里开始偏移
- SEEK_SET:文件描述符的开始位置
- SEEK_CUR:文件描述符的当前位置
- SEEK_END:文件描述符的末尾位置
- 返回值
- 成功:返回当前位置到开始位置的长度
- 失败:返回-1,并设置errno
例子1:把字符串“helloworld”写入一个文件,然后读取这个文件,把“helloworld”从文件中读取出来,并打印到终端。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char* argv[]){
int fd = open(argv[1], O_RDWR|O_CREAT, 0666);
write(fd, "helloworld\n", 11);
//这里必须使用lseek,来调整文件指针的位置,设置文件指针设置到文件的开始位置。
lseek(fd, 0, SEEK_SET);
char buf[20] = {0};
int ret = read(fd, buf, sizeof buf);
write(STDOUT_FILENO, buf, ret);
close(fd);
return 0;
}
read和write的内幕:虽然read和write的参数里没有,文件指针所在位置的参数,但是,执行read或者write后,文件指针所在位置会被自动调整到:【当前位置+读入或者写入的字节数】的位置。
例子2:计算文件的大小
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
int main(int argc, char* argv[]){
int fd = open(argv[1], O_RDWR);
//open后,文件指针的位置在文件开头
//因为:lseek返回当前位置到开始位置的长度
//所以用lseek移动到了文件末尾,这时lseek的返回值就是文件的大小
int ret = lseek(fd, 0, SEEK_END);
printf("file size:%d\n", ret);
close(fd);
}
例子3:创建文件大小为1024的文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
int main(int argc, char* argv[]){
int fd = open(argv[1], O_WRONLY|O_CREAT, 0666);
//打开后文件指针在文件的开始位置,然后从开始位置移动1023个字节,然后再调用write,
//注意不调用后面的write的话,创建的文件的大小是为0的。
lseek(fd, 1023, SEEK_SET);
write(fd, "a", 1);
close(fd);
}
c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854
linux open write lseek的API和应用的更多相关文章
- Linux -- 基于zookeeper的java api(二)
Linux -- 基于zookeeper的java api(二) 写一个关于基于集群的zookeeper的自定义实现HA 基于客户端和监控器:使用监控的方法查看每个注册过的节点的状态来做出操作. Wa ...
- Linux -- 基于zookeeper的java api(一)
Linux -- 基于zookeeper的java api 首先启动你所有的 zkService.sh 查看状态:检查是否启动正确 [root@hu-hadoop2 ~]# zkServer.sh s ...
- Linux PWM framework简介和API描述【转】
本文转载自:https://blog.csdn.net/mike8825/article/details/51656400 1. 前言 PWM是Pulse Width Modulation(脉冲宽度调 ...
- Linux内核 GPIO操作部分API
内核中关于GPIO的操作API主要集中在<linux/of_gpio.h>和<linux/gpio.h>中,前者主要是GPIO直接与设备树相关的操作,在Linux 设备树操作A ...
- LInux内核分析--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
实验者:江军 ID:fuchen1994 实验描述: 选择一个系统调用(13号系统调用time除外),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3 ...
- Linux中断 - 驱动申请中断API
一.前言 本文主要的议题是作为一个普通的驱动工程师,在撰写自己负责的驱动的时候,如何向Linux Kernel中的中断子系统注册中断处理函数?为了理解注册中断的接口,必须了解一些中断线程化(threa ...
- linux第5天 socket api
IPv4套接口地址结构通常也称为“网际套接字地址结构”,它以“sockaddr_in”命名,定义在头文件<netinet/in.h>中 通用地址结构用来指定与套接字关联的地址.以socka ...
- Linux网络编程-----Socket地址API
(1) 通用socket地址 socket网络编程接口中表示socket地址的是结构体sockaddr,其定义如下: #include<bits/socket.h> struct sock ...
- 20135239 益西拉姆 linux内核分析 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
https://drive.wps.cn/preview#l/759e32d65654419cb765da932cdf5cdc 本次直接在wps上写的,因为不能连同图片一起粘贴过来,一个一个粘比较费时 ...
随机推荐
- FMDB的简单实用
一.FMDB 的框架引入点击此处去GitHub下载 二.FMDB 的优缺点 优点:使用起来更加面向对象,省去了很多麻烦.冗余的C语言代码:对比苹果自带的Core Data框架,更加轻量级和灵活:提供了 ...
- Oracle-12:伪列rowid和rownum
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 伪列:不真实存储在真表中,但是我们可以查询到不能对伪列进行增删改操作! 分页可以用rownum来分!!!!!! ...
- SSM-Spring-14:Spring中默认自动代理DefaultAdvisorAutoProxyCreator
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 默认自动代理DefaultAdvisorAutoProxyCreator 本处没有什么要讲的,放原代码 ISo ...
- springboot整合shiro后报java.lang.ClassCastExcepting异常
最近搭一个springboot的框架,整合了shiro和redis,由于平常习惯用热部署,所以自然的引入了热部署的包,但是引入后报如下错误: 没错,这个问题害我搞了一天,后来删除热部署,项目正常的跑飞 ...
- MySQL事务原理&实战【官方精译】
事务隔离级别 事务隔离是数据库处理的基础之一.隔离是I中的首字母 ACID ; 隔离级别是在多个事务同时进行更改和执行查询时,对结果的性能和可靠性,一致性和可重复性之间的平衡进行微调的设置. Inno ...
- Django 的数据库查询
class Blog(models.Model): name = models.CharField(max_length=100) tagline = models.TextField() def _ ...
- Spring Security-- 验证码功能的实现
spring security4 添加验证码 http://www.itwendao.com/article/detail/165400.html http://www.itdadao.com/art ...
- Loadrunner三种post格式的请求
Loadrunner三种post格式的请求 web_custom_request intweb_custom_request(const char *RequestName, <List of ...
- rename.go
{ if err != nil { return err } return syscall.EINVAL } r ...
- Guava新增集合类型-Multiset
Guava新增集合类型-Multiset Guava引进了JDK里没有的,但是非常有用的一些新的集合类型.所有这些新集合类型都能和JDK里的集合平滑集成.Guava集合非常精准地实现了JDK定义的接口 ...