阻塞和非阻塞的概念
读常规文件是不会阻塞的,不管读多少字节,read一定会在有限的时间内返回。
从终端设备或网络读则不一定,如果从终端输入的数据没有换行符,调用read读终端设备就会阻塞,如果网络上没有接收到数据包,调用read从网络读就会阻塞,至于会阻塞多长时间也是不确定的,如果一直没有数据到达就一直阻塞在那里。
同样,写常规文件是不会阻塞的,而向终端设备或网络写则不一定。
【注意】阻塞与非阻塞是对于文件而言的,而不是指read、write等的属性。
以非阻塞方式打开文件程序示例:
#include <unistd.h> //read
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h> //EAGAIN
int main()
{
// /dev/tty --> 当前终端设备
// 以不阻塞方式(O_NONBLOCK)打开终端设备
int fd = open("/dev/tty", O_RDONLY | O_NONBLOCK);
char buf[10];
int n;
n = read(fd, buf, sizeof(buf));
if (n < 0)
{
// 如果为非阻塞,但是没有数据可读,此时全局变量 errno 被设置为 EAGAIN
if (errno != EAGAIN)
{
perror("read /dev/tty");
return -1;
}
printf("没有数据\n");
}
return 0;
}