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上写的,因为不能连同图片一起粘贴过来,一个一个粘比较费时 ...
随机推荐
- kvm常见故障及解决
一.启动虚拟机Connection reset by peer # virsh start vmhost1error: Failed to start domain vmhost1error: Una ...
- Spring BeanWrapper分析
最近在读DispatcherServlet 源代码,看到父级类org.springframework.web.servlet.HttpServletBean中关于BeanWrapper的一段代码, 继 ...
- 第一章——机器学习总览(The Machine Learning Landscape)
本章介绍了机器学习的一些基本概念,已经应用场景.这部分知识在其它地方也经常看到,不再赘述. 这里只记录一些作者提到的,有趣的知识点. 回归(regression)名字的来源:这是由Francis Ga ...
- 领域驱动设计和Spring
原文 http://static.olivergierke.de/lectures/ddd-and-spring/ 1.介绍这篇文章是的介绍一下领域驱动设计的基础构件.概念和Java的web应用(主要 ...
- aliyun oss操作汇总
// endpoint以杭州为例,其它region请按实际情况填写 String endpoint = "http://oss-cn-hangzhou.aliyuncs.com"; ...
- 用react重构个人网站 3-22
问题一:import React from 'react'这个写法是怎么回事? 答案:require是common.js的写法,import是ES6的写法,主要功能都是引入模块,写法上: var mo ...
- 创建本地数据库mySQL并连接JDBC
转自: http://blog.csdn.net/wei_chong_chong/article/details/44830491 如何创建本地数据库MySQL并连接JDBC 转载 2015年04月0 ...
- Linux.安装phantomjs
PhantomJS 是一个基于 WebKit 的服务器端 JavaScript API.它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, CSS 选择器, JSON, ...
- bzoj4871 [Heoi2017]摧毁“树状图”
刷完了去年的省选题,发现自己dp已经凉凉了. 虽然暴力可以拿到80分的好成绩,但是正解的dp状态和转移还是没能想到,是时候补一波dp了 这道题我们肯定是要树形dp,存的肯定就是子树某种状态的最多的联通 ...
- Java I/O流详解与应用
注:学习之前,需要自己思考,不要盲目的去看!!!!!不然没有任何意义 I/O流(一) 1.定义:实现设备之间的传输 2.作用:实现数据的读入和写出 3.分类:根据操作分为:输入流和输出流 根据类型分为 ...