51dev.com IT技术开发者社区

51dev.com 技术开发者社区

Android系统开发(6)——Linux底层输入输出

Android互联网报道阅读(87)2018-04-23 收藏0次评论

一、操作系统的体系结构

计算机是由一堆硬件组成的,操作系统是为了有效的控制这些硬件资源的软件。操作系统除了有效地控制这些硬件资源的分配,并提供计算机运行所需要的功能之外,为了提供程序员更容易开发软件的环境,操作系统还提供了一整组系统调用接口。
如上图所示,最中间的是硬件,操作系统是由内核和系统调用接口组成,其中内核是直接操作硬件的,内核提供了对这些硬件资源的控制和进程管理,系统调用接口向上提供了统一的调用接口方便开发人员调用。最上层就是应用程序,在应用程序中调用系统接口就能实现对硬件的操作。

二、linux I/O系统


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

三、I/O的操作过程

1、打开文件一个应用程序通过要求内核打开相应的文件,宣告他要访问一个I/O设备,内核返回一个非负整数,叫描述符号(DescriptZ喎?https://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcqOpob7OxLz+zqjSu7HqyrahvzKhorbB0LTOxLz+tsGjurTTzsS8/r+9sbRuPjC49tfWvdq1vbTmtKLG96OoxNq05qOp0LSjurTTtOa0osb3o6jE2rTmo6m/vbG0bj4wuPbX1r3atb3OxLz+M6GiuMSx5M7EvP7Ou9bDNKGiudix1c7EvP621NPaxNq6y7b40dSjrMv509C08r+qzsS8/ra808nOxLz+w+jK9rf70v3Tw6GjzsS8/sPoyva3+8rH0ru49rfHuLrV+8r9oaO1sbTyv6rSu7j2z9a05s7EvP678rS0vajSu7j20MLOxLz+yrGjrMTausvP8r34s8y3tbvY0ru49s7EvP7D6Mr2t/uho7WxtsHQtNK7uPbOxLz+yrGjrNPDb3BlbrvyY3JlYXRlt7W72LXEzsS8/sPoyva3+2ZkserKtrjDzsS8/qOsvavG5Nf3zqqyzsr9tKvLzbj4cmVhZLvyd3JpdGUutvjB9yjI5zogZm9wZW4pt7W72LXEysfSu7j2RklMRb3hubnWuNXrLCBGSUxFveG5ucrHsPy6rNPQzsS8/sPoyva3+7XEo6xGSUxFveG5ubqvyv2/ydLUv7TX98rHttRmZNaxvdOy2df3tcTPtc2ztffTw7XEt+LXsCwgy/y1xNPFtePKx7T409BJL0+7urTmPHA+TGludXjWp7PWuPfW1rj30fm1xM7EvP7Ptc2zuPHKvaOsyOdleHQyoaJleHQzoaJyZWlzZXJmc6GiRkFUoaJOVEZToaJpc285NjYwtci1yKOssrvNrLXEtMXFzLfWx/ihornixcy78sbky/y05rSiyeixuLa809Cyu82stcTOxLz+z7XNs7jxyr2jrMi7tvjV4tCpzsS8/s+1zbO2vL/J0tRtb3VudLW9xLO49sS/wrzPwqOsyrnO0sPHv7S1vdK7uPbNs9K7tcTEv8K8yvejrLj31tbOxLz+z7XNs8nPtcTEv8K8us3OxLz+ztLDx9PDbHPD/MHuv7TG8MC0ysfSu9H5tcSjrLbB0LSy2df308PG8MC00rK2vMrH0rvR+bXEo6zV4srH1PXDtNf2tb21xMTYo79MaW51eMTausvU2rj31tayu82stcTOxLz+z7XNs7jxyr3WrsnP1/bBy9K7uPaz6c/zsuOjrMq5tcPOxLz+oaLEv8K8oaK2wdC0t8POyrXIuMXE7rPJzqqz6c/zsuO1xLjFxO6jrNLytMu499bWzsS8/s+1zbO/tMbwwLTTw8bwwLS2vNK70fmjrNXiuPaz6c/zsuOzxs6q0OnE4s7EvP7Ptc2zo6hWRlOjrFZpcnR1YWwgRmlsZXN5c3RlbaOpPC9wPjxwPjxpbWcgc3JjPQ=="http://www.51dev.com//FileUpload/news/201804/20180423002340987.png" />

四、Linux底层输入输出

我们可以去GNU下载libc的源代码和帮助文档(源码下载地址:https://ftp.gnu.org/gnu/glibc/)打开和关闭文件流
#include 
#include 
#include 
#include 
#include 

int main(int argc, char *argv[]){
        //open file
        if(argc<2){
                printf("please input filename
");
                exit(1);
        }else{
                int fd;
                umask(0000);
                fd = open(argv[1], O_RDWR|O_CREAT, 0666);
                if(fd < -1){
                        printf("error
");
                        exit(1);
                }else{
                        printf("success=%d
", fd);
                        close(fd);
                        printf("closed
");
                }
        }
        return 0;
}
读文件(写文件的过程和读文件类似)
#include 
#include 
#include 
#include 
#include 
#include 

int main(int argc, char *argv[]){
        //open file
        if(argc<2){
                printf("please input filename
");
                exit(1);
        }else{
                int fd;
                umask(0000);
                fd = open(argv[1], O_RDWR|O_CREAT, 0666);
                if(fd < -1){
                        printf("error
");
                        exit(1);
                }else{
                        printf("success=%d
", fd);
                        char buf[1024];
                        memset(buf, 0, 1024);
                        int returnum = read(fd, buf, 1024);
                        if(returnum != -1){
                                printf("buf=%s
", buf);
                        }else{
                                printf("read error
");
                                exit(1);
                        }
                        close(fd);
                        printf("closed
");
                }
        }
        return 0;
}


以上就是Android系统开发(6)——Linux底层输入输出的全部内容,请多关注【51DEV】IT技术开发者社区。