1 函数原型
#include<unistd.h>
ssize_t read( int fd, void *buf, size_t nbytes);
返回值:读到的字节数,若已到达文件尾返回0;如出错返回-1
如果read成功,返回读到的字节数,到文件尾返回0. 正常情况肯定都大于等于0. 有错误情况就是-1(返回值)
2 重点 :当某一个信号造成中断while reading
-
read() 在读取任何数据之前被信号打断(即由于没有可用数据而不得不阻塞),则它将返回-1并将其errno设置为[EINTR]。
系统调用分为 低速系统调用和其他系统调用。低速系统调用是会可能让进程永远堵塞的一类系统调用:
在读某些类型的文件时,如果数据并不存在则可能会使调用者永远阻塞(管道、终端设备以及网络设备)。
在写这些类型的文件时,如果不能立即接受这些数据,则也可能会使调用者永远阻塞。
打开文件,在某种条件发生之前也可能会使调用者阻塞(例如,打开终端设备,它要等待直到所连接的调制解调器回答了电话)。
pause(按照定义,它使调用进程睡眠直至捕捉到一个信号)和wait。
某种ioctl操作。某些进程间通信函数 -
当read已经读取了部分数据,然后被中断了,此时会设置errno为 EINTR。。
人为当碰到EINTR错误的时候,有一些可以重启的系统调用要进行重启,而对于有一些系统调用是不能够重启的。例如:accept、read、 write、select、和open之类的函数来说,是可以进行重启的。然后重启后又开始读取。 -
而当对于一个非堵塞的描述符,如果没有数据可读了,就会返回 -1,errno 被设置为EAGAIN。
-
综合上述得出,如果在一个http server 中,想要正常的去读文件写文件。就需要处理这两个错误。
代码:
- 关于read函数的处理: