Android系统开发(6)——Linux底层输入输出
一、操作系统的体系结构
最上层就是应用程序,在应用程序中调用系统接口就能实现对硬件的操作。
二、Linux I/O系统
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGF3YW5nYW5iYW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />
三、I/O的操作过程
当读写一个文件时,用open或create返回的文件描写叙述符fd标识该文件,将其作为參数传送给read或write.而流(如: fopen)返回的是一个FILE结构指针, FILE结构是包括有文件描写叙述符的。FILE结构函数能够看作是对fd直接操作的系统调用的封装, 它的长处是带有I/O缓存
Linux支持各种各样的文件系统格式。如ext2、ext3、reiserfs、FAT、NTFS、iso9660等等。不同的磁盘分区、光盘或其他存储设备都有不同的文件系统格式,然而这些文件系统都能够mount到某个文件夹下,使我们看到一个统一的文件夹树,各种文件系统上的文件夹和文件我们用ls命令看起来是一样的,读写操作用起来也都是一样的,这是怎么做到的呢?Linux内核在各种不同的文件系统格式之上做了一个抽象层,使得文件、文件夹、读写訪问等概念成为抽象层的概念,因此各种文件系统看起来用起来都一样。这个抽象层称为虚拟文件系统(VFS,Virtual Filesystem)
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGF3YW5nYW5iYW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />
四、Linux底层输入输出
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h> int main(int argc, char *argv[]){
//open file
if(argc<2){
printf("please input filename\n");
exit(1);
}else{
int fd;
umask(0000);
fd = open(argv[1], O_RDWR|O_CREAT, 0666);
if(fd < -1){
printf("error\n");
exit(1);
}else{
printf("success=%d\n", fd);
close(fd);
printf("closed\n");
}
}
return 0;
}
读文件(写文件的过程和读文件相似)
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h> int main(int argc, char *argv[]){
//open file
if(argc<2){
printf("please input filename\n");
exit(1);
}else{
int fd;
umask(0000);
fd = open(argv[1], O_RDWR|O_CREAT, 0666);
if(fd < -1){
printf("error\n");
exit(1);
}else{
printf("success=%d\n", fd);
char buf[1024];
memset(buf, 0, 1024);
int returnum = read(fd, buf, 1024);
if(returnum != -1){
printf("buf=%s\n", buf);
}else{
printf("read error\n");
exit(1);
}
close(fd);
printf("closed\n");
}
}
return 0;
}
最新文章
- Hadoop学习笔记—3.Hadoop RPC机制的使用
- Google C++单元测试框架---Gtest框架简介(译文)
- 上传AppStore出现:Unexpected CFBundleExecutable Key 错误
- 使用sublime编写c/c++ 总结
- 【转载】Java中的回车换行符/n /r /t
- 【CodeForces 489A】SwapSort
- 一天一点MySQL复习——存储过程
- HDU 5765 Bonds 巧妙状压暴力
- Linq DataTable Group By 分组显示人员明细
- CAN总线
- Linux网络管理——Linux网络命令
- ArrayList源码解析(四)
- Spring 加载静态资源
- mysql操作sql的小技巧
- PHP中文关键词匹配
- navicat使用ssh登录mysql报错:expected key exchange group packet from server
- Day033--Python--进程
- mysql 5.7 修改密码
- JavaScript世界的一等公民—— 函数
- merge源表数据移植到目标表新表数据中
热门文章
- Educational Codeforces Round 20 C. Maximal GCD
- javascript基础2 判断 数据类型
- NuGet安装本地包命令行
- 山东理工大学第七届ACM校赛-G 飞花的传送门
- 【Luogu】P2766最长不下降子序列问题(暴力网络流)
- [POJ3974]Palindrome(后缀数组 || manacher)
- [暑假集训--数位dp]LightOj1032 Fast Bit Calculations
- C# 模拟windows文件名称排序(使用windows自带dll)
- 洛谷 P1131 选择客栈
- 【HDOJ6229】Wandering Robots(马尔科夫链,set)