zoukankan      html  css  js  c++  java
  • 第14章高级IO总结

    1 低速系统调用

    可能使进程永远阻塞的一类系统调用,包括:

    1)读某些文件类型(管道、终端、网络设备)的数据

    2)写某些文件类型(管道、终端、网络设备),但数据不能被立即接受(管道中无空间、流量控制等因素)

    3)打开某些文件类型

    4)对已经加上强制性记录锁的文件进行读、写

    5)某些ioctl函数

    6)某些进程间通信函数

    2 记录锁

    当一个进程正在读或修改文件的某一部分时,可以阻止其他进程修改同一文件区

    #include <fcntl.h>
    int fcntl(int filedes,int cmd,.../* struct flock *flockptr */
    struct flock
    {
      short  l_type;/* F_RDLCK,F_WRLCK,F_UNLCK */
      off_t  l_start;/* offset in bytes,relative to l_whence */
      short  l_whence;/* SEEK_SET,SEEK_CUR,SEEK_END */ 
      off_t  l_len; /* length,in bytes;0 means lock to EOF */
      pid_t  l_pid;/* returned with F_GETLK */
    }

    F_GETLK:判断flockptr是否会被其他记录锁排斥,会则将排斥该锁的锁信息填充到flockptr,不排斥则将l_type设置为F_UNLCK

          F_GETFL函数并不是查询一个文件的记录锁,而是查询一个记录锁是否与其他记录锁冲突

    F_SETLK:尝试建立flockptr描述的文件锁,非阻塞

    F_SETLKW:建立文件锁的阻塞版本

    文件的记录锁信息在文件V节点表中,通过struct flock类型链表保存

    3 I/O多路转接 select

    当需要从多个文件中进行读写操作时,阻塞式I/O和非阻塞式I/O各有问题

    select函数在目标文件描述符集中查询是否有可读、可写的文件描述符,有则返回,无则等待(或返回,与tvptr有关)

    #include <sys/select.h>
    int select(int maxfdp1,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,struct timeval *tvptr)

    readfds、writefds、exceptfds分别表示关心的可读、可写、异常文件描述
    maxfdp1表示三个文件描述符集中最大文件描述符加1

    返回值:

    -1:出错

    0:没有文件描述符准备好

    正值:已经准备好的描述符数

    tvptr:

    struct timeval
    {
        long tv_sec;
        long tv_usec;
    };

    tvptr=NULL:无限等待
    tvptr->tv_sec==0 && tvptr->tv_usec==0:查询并立即返回

    tvptr->tv_sec!=0 || tvptr->tv_usec!=0 :最多等待时间

    fd_set的操作:

    #include <sys/select.h>
    int FD_ISSET(int fd,fd_set *fdset)
    void FD_CLR(int fd,fd_set *fdset)
    void FD_ADD(int fd,fd_set *fdset)
    void FD_ZERO(fd_set *fdset)

    select函数变体pselect函数:

    int pselect(int maxfdp1,fd_set *readfds,fd_set *writefds,fd_set *excepfds,const struct timespec tsptr,const sigset_t *sigmaske)

    pselect函数支持函数执行时信号屏蔽字设置,同时时间采用timespec结构(秒和纳秒,比timeval更精确)

    4 I/O多路转接 poll

    poll函数类似于select函数但提供不同的函数接口:

    int poll(struct pollfd fdarrat[],nfds_t nfds,int timeout)
    struct pollfd
    {
      int fd;
      short events;
      short revents;
    };

    events表示在fd上关心的状态,revents返回时被填写

    events和revents可取值:

    POLLIN:不阻塞的可读除高优先级之外的数据

    POLLRDNORM:不阻塞的可读普通数据

    POLLRDBAND:不阻塞的可读非0优先级波段数据

    POLLPRI:不阻塞的可读高优先级数据

    POLLOUT:不阻塞的可写普通数据

    POLLWRNORM:与POLLOUT相同

    POLLWRBAND:不阻塞的可写非0优先级波段数据

    仅revents可取值:

    POLLERR:已出错

    POLLHUP:已挂断

    POLLNVAL:描述符不引用一打开文件

     

    5 存储映射I/O

     

    #include <sys/mman.h>
    void *mmap(void *addr,size_t len,int prot,int flag,int filedes,off_t off)

     

    prot:映射区权限

      PROT_READ:映射区可读

      PROT_WRITE:映射区可写

      PROT_EXEC:映射区可执行

      PROT_NONE:映射区不可访问

    flag:

      MAP_FIXED:返回值必须等于addr

      MAP_SHARED:缓冲区操作修改映射文件

      MAP_PRIVATE:缓冲区操作对应映射文件的副本

    修改映射缓冲区权限:

    #include <sys/mman.h>
    int mprotect(void *addr,size_t len,int prot)

    解除映射:

    int munmap(addr_t *addr,size_t len)
  • 相关阅读:
    [POJ] 食物链
    [POJ] Palindrome
    [POJ] The Triangle
    [Cpp primer] Library vector Type
    Shift Operations on C
    Masking operations
    [CSAPP] The Unicode Standard for text coding
    [Cpp primer] Library string Type
    [Cpp primer] range for (c++11)
    [Cpp primer] Namespace using Declarations
  • 原文地址:https://www.cnblogs.com/buptlyn/p/4177808.html
Copyright © 2011-2022 走看看