1.库函数和系统函数的对比(得在一定条件下,得在系统函数那个程序把buf设置成1,如果设置成4096那么两个程序的速度是一样的)
使用库函数虽然看似比直接使用系统调用多了一步,但是从用户空间进入内核空间耗时巨大,在对比库函数和系统函数的copy.c中,系统函数buf被设置成1时,程序每读取一个字节就得完成一次内核空间和用户空间的跳转,而库函数(fputc函数),在函数内部有一个buf而这个buf默认是4096,也就是内核空间的缓冲向磁盘写入所需要的值(每当内核空间缓冲满4096,就向磁盘写入数据),所以可以看出库函数并不像系统函数每读一个字节就向内核空间写入,而是在自己的用户空间缓冲里写满4096个字节后一起缓冲进入内核空间,这就大大减小了时间而提高了效率(内核什么时候往磁盘写那是操作系统的事情,函数只管往缓冲里写数据就完事了)。
所以像如同read write这样的函数经常被称为 unbuffered I/O(无用户级缓冲IO)。
PCB进程控制块:
实质上是一个结构体,在这个结构体成员中有一根指针指向了文件描述符表,也就是类似于open函数返回的fd的值,这个表有点像数组,每个数组元素都是指针,用户只需操作它的下标fd即可,不需要去知道数组元素去干了些什么。
文件描述符:0/1/2/3……
文件描述符表中的0,1,2对应的宏为:STDIN_FILENO,STDOUT_FILENO,STDERR_FILENO.需要掌握
阻塞非阻塞的概念(稍微了解):
常规文件是不会阻塞的,不论多少字节。
产生阻塞时间的场景:读设备文件,读网络文件。
/dev/tty 这个文件所对应就是终端,也就是终端文件
阻塞场景代码如下:
int n;
char buf[10];
n = read(STDIN_FILENO,buf,10);
if(n < 0){
perror(“read STDIN_FILENO”);
exit(1);
}
write(STDOUT_FILENO,buf,n);
现象:执行程序,程序等待键盘输入,输入“hello”,可以看出打印出来“hello”
阻塞是设备文件或网络文件的一种属性。非阻塞可以设置O_NONBLOCK
非阻塞:可以用open函数以非阻塞方式打开/dev/tty终端文件,如果终端文件没有数据open返回值是负数。
设置超时:就是一个for循环,循环几次没读到就不读了