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上写的,因为不能连同图片一起粘贴过来,一个一个粘比较费时 ...
随机推荐
- jquery mobile 表单提交 图片/文件 上传
jquerymobile 下面 form 表单提交 和普通html没区别,最主要是 <form 要加一个 data-ajax='false' 否则 上传会失败 1 html代码 <!do ...
- 使用libpcap过滤arp
上一篇博客简单讲述了libpcap的工作流程及简单使用,今天我们需要做的是继续使用libpcap抓取我们感兴趣的流量,并进行简单的解析: 测试环境是centos 7 下面贴一张arp帧结构图: 下面我 ...
- Spring Cloud Sleuth服务链路追踪(zipkin)(转)
这篇文章主要讲述服务追踪组件zipkin,Spring Cloud Sleuth集成了zipkin组件. 一.简介 Spring Cloud Sleuth 主要功能就是在分布式系统中提供追踪解决方案, ...
- Java 面试知识点解析(五)——网络协议篇
前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...
- 豆瓣API
Api V2 索引 图书Api V2 电影Api V2 音乐Api V2 同城Api V2 广播Api V2 用户Api V2 日记Api V2 相册Api V2 线上活动Api V2 论坛Api V ...
- 深入JVM分析spring-boot应用hibernate-validator
问题 可重现的Demo代码:demo.zip 最近排查一个spring boot应用抛出hibernate.validator NoClassDefFoundError的问题,异常信息如下: Caus ...
- python 3 中的raw_input 报错
raw_input() was renamed to input()
- Spark2.1.0——Spark初体验
学习一个工具的最好途径,就是使用它.这就好比<极品飞车>玩得好的同学,未必真的会开车,要学习车的驾驶技能,就必须用手触摸方向盘.用脚感受刹车与油门的力道.在IT领域,在深入了解一个系统的原 ...
- 详解vue生命周期
vue生命周期 @(vue)[生命周期] 前言 在使用vue一个多礼拜后,感觉现在还停留在初级阶段,虽然知道怎么和后端做数据交互,但是对于mounted这个挂载还不是很清楚的.放大之,对vue的生命周 ...
- Android 实战美女拼图游戏 你能坚持到第几关
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40595385,本文出自:[张鸿洋的博客] 1.概述 继2048之后,今天给大家带 ...