Linux应用开发 01 系统IO

一. Linux 应用开发
   1. 内容架构
      1.1  硬件设备访问
      1.2  多任务处理
      1.3  网络编程
      1.4  数据库编程
   2. 硬件设备访问
        我们知道 Linux 系统一切皆文件,所以硬件设备往往在Linux文件系统中会对应一个设备文件,我们是可以通过访问设备文件达到访问硬件设备的目的;

相关概念:
        文件描述符: 本质:非负整数。linux系统会为被操作的文件进行一个编号,该编号用来唯一标识该文件,该编号就被称为该文件的文件描述符;

常用系统IO函数:

1.  access
 头文件:  

 #include <unistd.h>
 #include <fcntl.h>
 函数原型: int access(const char *pathname, int mode);
 函数功能:  确认pathname 代表的文件/目录 是否存在或访问权限
 函数参数:

 pathname:  待确认的文件路径
 mode: 判断模式,取值如下:
         R_OK:  当前用户对文件的读权限
         W_OK:  当前用户对文件的写权限
         X_OK:  当前用户对文件的执行权限
         F_OK:  文件是否存在
 函数返回值:待确认的模式有效 返回0
                       否则返回 -1.  错误码存放在 errno 
    2.  open
         头文件:   #include <unistd.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_TRUNC     写前先清空原文件
                    O_CREAT     创建
            mode: 如果指定创建标记,mode用来设置文件权限
         函数返回值:  成功返回  文件描述符
                       否则返回 -1.  错误码存放在 errno 

    3.  read
         头文件:   #include <unistd.h>
                    #include <fcntl.h>
         函数原型: ssize_t read(int fd, void* buf,int count);
         函数功能:  读取文件内容
         函数参数: fd:        待读取的文件描述符
                    buf :      内存空间,用于存储读取到的内容:
            count:    待读取的字节数
         函数返回值:  成功返回  实际读取到的字节数
                              0: 读到文件末尾,或无数据可读
                       否则返回 -1.  错误码存放在 errno 

        4.  write
         头文件:   #include <unistd.h>
                    #include <fcntl.h>
         函数原型: ssize_t write(int fd, const void* buf,int count);
         函数功能:  写入文件内容
         函数参数: fd:        待写入的文件描述符
                    buf :      内存空间,用于存储要写入的内容:
            count:    待写入的字节数
         函数返回值:  成功返回  实际写入的字节数
                       否则返回 -1.  错误码存放在 errno 

    5.  close
         头文件:   #include <unistd.h>
                    #include <fcntl.h>
         函数原型: int close(int fd);
         函数功能:  关闭文件,释放文件描述符
         函数参数: fd:        待关闭的文件描述符
         函数返回值:  成功返回  0
                       否则返回 -1.  错误码存放在 errno 

        6.  lseek
         头文件:   #include <unistd.h>
                    #include <fcntl.h>
         函数原型: off_t lseek(int fd,off_t off,int whence);
         函数功能:  移动文件位置指针
         函数参数: fd:        待操作的文件描述符
                    off:      文件位置指针相对偏移量
                        whence:   参考位置
         函数返回值:  成功返回  当前位置指针距离文件头的偏移量
                       否则返回 -1.  错误码存放在 errno 

    7.  mmap/munmap
         头文件:   #include <unistd.h>
                    #include <fcntl.h>
            #include <sys/mman.h>
         函数原型: void* mmap(void* addr,int len,int prot,int flags,int fd,off_t off);
                    int munmap(void* addr,int len);
         函数功能:  映射/解映射 文件到进程的地址空间
         函数参数:   addr:     需用户指定的映射地址,往往填 NULL 由系统决定 
                      len:       映射/解映射 的地址空间大小(字节为单位)
                          prot:     为映射后的内存指定访问属性(要和文件的打开方式保持一致)
              flags:     映射标记,标明该内存是否可被共享等
                      fd:        待关闭的文件描述符
              off:      文件中映射内容相对文件头的偏移
         函数返回值:  成功  munmap返回  0    mmap 返回实际映射的内存的首地址
                       否则  munmap返回 -1.   mmap 返回 MAP_FAILED, 错误码存放在 errno 

     8.  ioctl
         头文件:   #include <unistd.h>
                    #include <fcntl.h>
            #include <sys/ioctl.h>
         函数原型: int ioctl(int fd,int request,...);
         函数功能:  对fd 代表的文件/设备进行操作控制
         函数参数: fd:            待操作的文件描述符
                    request:      基于设备的请求码
                        第三个参数:   视 request 而定,
         函数返回值:  成功返回  0,少数request码会以返回值作为结果数据
                       否则返回 -1.  错误码存放在 errno 
            
   3. 文件状态信息获取
            
             stat/ fstat
         头文件:   #include <unistd.h>
                    #include <fcntl.h>
            #include <sys/types.h>
            #include <sys/stat.h>
         函数原型: int stat(const char* filepath,struct stat * si);
                    int fstat(int fd,struct stat * si);
         函数功能:  文件状态信息获取
         函数参数: fd:            待操作的文件描述符
                    filepath:     待操作的文件路径
                    si:           [OUT] struct stat指针变量,用户存储获取的文件状态信息                        
         函数返回值:  成功返回  0,
                       否则返回 -1.  错误码存放在 errno 

  4.  系统IO 和 标准 IO 区分:

       1.  效率
             系统IO会引起系统调用,系统调用是属于内核区操作,频繁的文件读取和写入造成程序在
         内核代码区和用户代码区的频繁切换,影响系统性能,降低系统运行效率,
             标准 IO 虽然最终也会引起系统调用,但是其采用了数据缓冲机制,频繁的文件读取和写入也
         仅是在数据达到一定数量后进行一次系统调用,减少了内核代码区和用户代码区的切换频率,
         可提升运行效率;
       2.  跨平台使用
             系统IO函数的使用是基于操作系统的,不同的操作系统提供的系统IO函数是不同的,所以基于某个
         操作系统的系统IO函数使用,在其他平台上是不被支持的,也就造成了无法进行跨平台的使用,
             标准 IO 提供了不同系统平台的统一标准接口,使得用户对标准IO的使用不必关注具体平台,
         非常方便在不同平台的统一操作。

  • 15
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值