一、操作系统的体系结构

计算机是由一堆硬件组成的,操作系统是为了有效的控制这些硬件资源的软件。操作系统除了有效地控制这些硬件资源的分配。并提供计算机执行所须要的功能之外,为了提供程序猿更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. javascript图片放大镜效果展示

    javascript图片放大镜效果展示 <!DOCTYPE html> <html> <head lang="en"> <meta cha ...

  2. CSS编码规范(转)

    1 前言 CSS作为网页样式的描述语言,在百度一直有着广泛的应用.本文档的目标是使CSS代码风格保持一致,容易被理解和被维护. 虽然本文档是针对CSS设计的,但是在使用各种CSS的预编译器(如less ...

  3. iOS-多线程(3)

    多线程之GCD(grand central dispatch)中心调度 为了简化多线程的操作,iOS为我们提供了GCD来实现编程. 使用GCD只要遵守两个步骤即可: 创建对列(串行队列,并行队列) 将 ...

  4. Linux System Programming 学习笔记(八) 文件和目录管理

    1. 文件和元数据 每个文件都是通过inode引用,每个inode索引节点都具有文件系统中唯一的inode number 一个inode索引节点是存储在Linux文件系统的磁盘介质上的物理对象,也是L ...

  5. es6总结(七)--proxy & reflect

  6. linux内核设计与实现第一章

    1.1 unix的历史 Thompson实现unix 伯克利大学对其进一步开发推出了著名的BSD 其他各大厂商相继推出自己的unix 1.1.2 unix的特性 unix系统是一个强大,健壮,稳定的操 ...

  7. bq25896 IINDPM 及 無 IINDPM 時的 regsiter

      無 IINDPM status 有 IINDPM status   [bq25890 reg@][0x0]=0x5d[0x1]=0x6[0x2]=0x91[0x3]=0x1a[0x4]=0x8[0 ...

  8. Android添加永不休眠选项

    很多朋友在使用TQ210做项目的时候都需要屏幕保持长亮,本文介绍如何修改TQ210 android源码,使系统可以永不休眠,代码如下: 1.添加英文选项 修改packages/apps/Setting ...

  9. ping探测在线主机

    一.实验要求: 1.对于给定范围的ip地址进行主机在线测试 2.ping测试结果保存在/tmp/ping目录下以时间戳为文件名的文件里,以便后续查看 二.实验过程: #!/bin/env/ bash# ...

  10. poj 1573(搜索)

    Robot Motion Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12351   Accepted: 5982 Des ...