read系统调用从文件描述符fd所指代的打开文件中读取数据。

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

count参数指定最多能读取的字节数,buffer提供用来存放输入数据的内存缓冲地址,缓冲区至少应有count个字节。如果buffer的长度不足count怎么办捏。

系统调用不会分配内存缓冲区用以返回信息给调用者,所以必须预先分配大小合适的缓冲区并将缓冲区指针传递给系统调用。

如果read调用成功了,将返回实际读取的字节数

如果遇到文件结束EOF,则返回0

如果出现错误则返回-1

一次read调用所读取的字节数可以小于请求的字节数。对于普通文件而言,这有可能是因为当前读取位置靠近文件尾部。这个应该好理解。

read应用于其他文件类型的时候,比如管道、FIFO、socket或者终端,在不同的环境下也会出现read调用读取的字节数小于请求字节数的情况。

例如,默认情况下从终端读取字符,一遇到换行(\n),read调用就结束了。

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h> int main(int argc, char *argv[]) { #define MAX_READ 20
char buffer[MAX_READ];
/* read something */
if(read(STDIN_FILENO, buffer,MAX_READ) == -) {
printf("read file error!\n");
exit();
}
printf("The input data was: %s\n", buffer);
printf("%c\n", buffer[MAX_READ-]);
return ;
}

书上说这段代码的输出可能会很奇怪,因为除了实际输入字符串以外,还会包括其他的字符,但是我这里并没有发现有其他的字符啊,感觉在buffer的最后一位已经被置为了'\0'了,然后书上说让手动把buffer每次都置为'\0'。

不过确实,buffer长度虽然是20,但是只读了19个字符。

还是挺有意思的。

完了,还有一个没有测,如果count比buffer的长度大会怎么样呢?我猜的是会丢失部分数据。

这,结果和我预期的相反,所有的数据还是全部在buffer里面了,不行我得查一下为啥:后来我试了一下,发现在freebsd上和centos上测试的结果不一样。

read时,如果fd中的数据如果小于要读取的数据,就会引起阻塞,这是啥意思啊。

read在读不同的数据时候的行为不一样,这个要注意。

比如普通文件,管道,socket

最新文章

  1. 如何设置redis中hash的field的expire ?
  2. [硬件项目] 1、汽车倒车雷达设计——基于API8108A芯片简易智能语音模块的设计与实现
  3. React Native填坑之旅--LayoutAnimation篇
  4. WPF之DataGrid
  5. MVC.Net: 解决Attempted to access an unloaded appdomain的问题
  6. POJ 1185 炮兵阵地(经典的状态压缩DP)
  7. IOS, xib和storyboard的混用--参考
  8. 漏洞大爆光:QQ漏洞、飞秋漏洞、360浏览器劫持…
  9. js optimization and performance
  10. 如何更好辨认House of hello恶搞包的真假
  11. 图示CCScrollView的相关概念
  12. 【原创】leetCodeOj --- Sliding Window Maximum 解题报告
  13. 工欲善其事:编辑器之神Vim(一)
  14. jmFidExt - Fiddler 代理插件
  15. Maven Install报错:Perhaps you are running on a JRE rather than a JDK?
  16. Open-Source Cybersecurity Infrastructure
  17. ubuntu16.04 下鼠标变成十字形状无法点击情况解决
  18. Qt5应用改变窗口大小时出现黑影
  19. BZOJ4738 : 汽水
  20. leetcode33

热门文章

  1. [80Sec]深掘XSS漏洞场景之XSS Rootkit
  2. sftp子系统申请已拒绝 请确保ssh连接的sftp子系统设置有效
  3. python中在ubuntu中安装虚拟环境及环境配置
  4. mysql索引处理
  5. OpenCV中的矩阵和图像类型
  6. iOS项目开发实战——使用CoreLocation获取当前位置信息
  7. Bitmap和Drawable的互相转换
  8. Visual studio之C# 新建线程与定时器的使用
  9. 基于Python-Flask实现的网站例子
  10. 学会Git玩转Github笔记(三)—— Github Pages 搭建个人网站