美文网首页
C: read/write

C: read/write

作者: 赵伯舟 | 来源:发表于2018-09-06 16:47 被阅读14次

    read

    read()函数从打开的设备或文件中读取数据,其函数原型如下:

    ssize_t read(int fd, void *buf, size_t count);
    

    参数count是请求读取的字节数,读上来的数据保存在缓冲区buf中,同时文件的当前读写位置向后移。当函数调用成功返回的是读取的字节数,出错返回-1并设置errno,如果在调read之前已到达文件末尾,则这次read返回0。
    有些情况下,实际读到的字节数(返回值)会小于请求读的字节数count,例如:

    1. 常规文件: 在读到count个字节之前已到达文件末尾。例如,距文件末尾还有30个字节而请求读100个字节,则read返回30,下次read将返回0
    2. 终端设备: 通常以行为单位,读到换行符就返回
    3. 网络: 根据不同的传输层协议和内核缓存机制,返回值可能小于请求的字节数

    write

    write函数向打开的设备或文件中写数据:

    ssize_t write(int fd, const void *buf, size_t count);
    

    read()类似,写常规文件时, write的返回值通常等于请求写的字节数count,而向终端设备或网络写则不一定

    read/write的阻塞

    对于不同的文件,read()函数的阻塞情况不同:

    1. 常规文件: 此时是不会阻塞的,不管读多少字节, read()一定会在有限的时间内返回
    2. 终端设备: 如果从终端输入的数据没有换行符,调用read()读终端设备就会阻塞
    3. 网络: 如果网络上没有接收到数据包,调用read()从网络读就会阻塞,至于会阻塞多长时间也是不确定的,如果一直没有数据到达就一直阻塞在那里

    同样,写常规文件是不会阻塞的,而向终端设备或网络写则不一定

    相关文章

      网友评论

          本文标题:C: read/write

          本文链接:https://www.haomeiwen.com/subject/txixgftx.html