read
read()
函数从打开的设备或文件中读取数据,其函数原型如下:
ssize_t read(int fd, void *buf, size_t count);
参数count是请求读取的字节数,读上来的数据保存在缓冲区buf中,同时文件的当前读写位置向后移。当函数调用成功返回的是读取的字节数,出错返回-1并设置errno,如果在调read之前已到达文件末尾,则这次read返回0。
有些情况下,实际读到的字节数(返回值)会小于请求读的字节数count,例如:
- 常规文件: 在读到count个字节之前已到达文件末尾。例如,距文件末尾还有30个字节而请求读100个字节,则read返回30,下次read将返回0
- 终端设备: 通常以行为单位,读到换行符就返回
- 网络: 根据不同的传输层协议和内核缓存机制,返回值可能小于请求的字节数
write
write函数向打开的设备或文件中写数据:
ssize_t write(int fd, const void *buf, size_t count);
与read()
类似,写常规文件时, write的返回值通常等于请求写的字节数count,而向终端设备或网络写则不一定
read/write的阻塞
对于不同的文件,read()
函数的阻塞情况不同:
-
常规文件: 此时是不会阻塞的,不管读多少字节,
read()
一定会在有限的时间内返回 -
终端设备: 如果从终端输入的数据没有换行符,调用
read()
读终端设备就会阻塞 -
网络: 如果网络上没有接收到数据包,调用
read()
从网络读就会阻塞,至于会阻塞多长时间也是不确定的,如果一直没有数据到达就一直阻塞在那里
同样,写常规文件是不会阻塞的,而向终端设备或网络写则不一定
网友评论