一、操作系统的体系结构

计算机是由一堆硬件组成的,操作系统是为了有效的控制这些硬件资源的软件。操作系统除了有效地控制这些硬件资源的分配。并提供计算机执行所须要的功能之外,为了提供程序猿更easy开发软件的环境。操作系统还提供了一整组系统调用接口。

如上图所看到的,最中间的是硬件。操作系统是由内核和系统调用接口组成,当中内核是直接操作硬件的,内核提供了对这些硬件资源的控制和进程管理。系统调用接口向上提供了统一的调用接口方便开发者调用。

最上层就是应用程序,在应用程序中调用系统接口就能实现对硬件的操作。

二、Linux I/O系统

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGF3YW5nYW5iYW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

如上图Linux的I/O系统结构图。内核层有一个虚拟文件系统,就是使用标准的c类库封装的api,所以我们要操作文件系统仅仅须要调用这里的api就可以。

三、I/O的操作过程

1、打开文件
一个应用程序通过要求内核打开对应的文件,宣告他要訪问一个I/O设备。内核返回一个非负整数。叫描写叙述符号(Descriptor)【文件唯一标识】
2、读写文件
读:从文件拷贝n>0个字节到存储器(内存)
写:从存储器(内存)拷贝n>0个字节到文件
3、改变文件位置
4、关闭文件
对于内核而言。全部打开文件都由文件描写叙述符引用。

文件描写叙述符是一个非负整数。当打开一个现存文件或创建一个新文件时,内核向进程返回一个文件描写叙述符。

当读写一个文件时,用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底层输入输出

我们能够去GNU下载libc的源代码和帮助文档(源代码下载地址:http://ftp.gnu.org/gnu/glibc/)
打开和关闭文件流
#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;
}

Android系统开发(6)——Linux底层输入输出的更多相关文章

  1. 《Android系统开发》笔记

    <Android系统开发>笔记1:Android系统概述 Android四层架构: 1. Linux Kernel&driver层 a.依赖于Linux 2.6内核,包含安全性.内 ...

  2. Android系统开发--灯光系统之电池灯的流程分析

    Android系统开发--Android灯光系统之电池灯的流程分析 前期系统准备 运行初始化,创建系统服务 创建电池服务,获得电池灯;创建监听者监听上报电池事件: mSystemServiceMana ...

  3. Android 系统开发做什么?

    题外话 18 年我从 Android 应用开发转 Framework 层开发了,从此开启了 996 幸福生活,博客技术文更新基本停滞了,被工作占据了过多的精力,实在没时间像以前一样拟稿.写作,实践.反 ...

  4. 【Android 系统开发】CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)

                 分类: Android 系统开发(5)                                              作者同类文章X 版权声明:本文为博主原创文章 ...

  5. Android系统开发实务实训

    实训项目 :               Android系统开发实务实训                           项目成品名称:         绝地坦克                 ...

  6. Android系统开发 编译系统签名的APP

    前言 一般情况下,我们使用的签名都是自己生成的Java签名来编译APP. 但是,如果需要开发一些特定设备的APP(对权限有更高的要求,需求一些系统基本的权限,比如让APP可以控制设备的休眠),那就需要 ...

  7. Android 系统开发学习杂记(转)

    http://blog.csdn.net/shagoo/article/details/6709430 > 开发环境1.安装 Eclipse 和 android-sdk 并解压安装2.Eclip ...

  8. 【Android 系统开发】Android框架 与 源码结构

    一. Android 框架 Android框架层级 : Android 自下 而 上 分为 4层; -- Linux内核层; -- 各种库 和 Android运行环境层; -- 应用框架层; -- 应 ...

  9. 浅谈Android系统移植、Linux设备驱动

    一.Android系统架构 第一层:Linux内核 包括驱动程序,管理内存.进程.电源等资源的程序 第二层:C/C++代码库 包括Linux的.so文件以及嵌入到APK程序中的NDK代码 第三层:An ...

随机推荐

  1. [python工具][2]sublime的快捷键

    十.Sublime Text 快捷键列表 快捷键按类型分列如下: 1.通用  ↑↓← →    上下左右移动光标 Alt    调出菜单 Ctrl + Shift + P    调出命令板(Comma ...

  2. Graham扫描法 --求凸包

    前言: 首先,什么是凸包? 假设平面上有p0~p12共13个点,过某些点作一个多边形,使这个多边形能把所有点都“包”起来.当这个多边形是凸多边形的时候,我们就叫它“凸包”.如下图:  然后,什么是凸包 ...

  3. CSSborder制作小三角形

    #cssborder制作小三角形 1.原理是CSS盒模型 一个盒子包括: margin+border+padding+content – 上下左右边框交界处出呈现平滑的斜线. 利用这个特点, 通过设置 ...

  4. HDU——2066一个人的旅行(优先队列SPFA水题)

    一个人的旅行 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  5. centos中简易安装docker

    centos中简易安装docker准备环境要求:请确保自己的centos的内核版本大于3.10,使用如下linux命令: uname -r1显示如下类似信息: 3.10.0-862.3.3.el7.x ...

  6. 深入浅出mysql全文随笔

    进入mysql :mysql -uroot -p 1.DDL(Data Definition Languages)语句:数据定义语言 2.DML(Data Manipulation Language) ...

  7. Miracast HDCP 等知识

    Miracast 通讯架构中关于视频数据处理流程的部分.整个视频数据处理及传输的流程,大致上分为几个阶段,一开始将撷取到系统的画面及声音进行压缩,而压缩后的影音数据再转为基本封包串流(Packetiz ...

  8. python 粘包问题及解决方法

    一粘包 TCP协议是面向对象的,面向流的,提高可靠性服务.使用了优化算法,Nagle算法.将多次间隔较少且数据量小的数据,合并成一个大的数据块,然后进行封包.这样接收端就很难分辨出来.TCP协议数据是 ...

  9. SpringBoot重点详解--使用Junit进行单元测试

    目录 添加依赖与配置 ApplicationContext测试 Environment测试 MockBean测试 Controller测试 情况一 情况二 方法一 方法二 本文将对在Springboo ...

  10. zoj 3791 An Easy Game dp

    An Easy Game Time Limit: 2 Seconds      Memory Limit: 65536 KB One day, Edward and Flandre play a ga ...