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) == -1) {
printf("read file error!\n");
exit(1);
}
printf("The input data was: %s\n", buffer);
printf("%c\n", buffer[MAX_READ-1]);
return 0;
}
书上说这段代码的输出可能会很奇怪,因为除了实际输入字符串以外,还会包括其他的字符,但是我这里并没有发现有其他的字符啊,感觉在buffer的最后一位已经被置为了'\0'了,然后书上说让手动把buffer每次都置为'\0'。
不过确实,buffer长度虽然是20,但是只读了19个字符。
还是挺有意思的。
完了,还有一个没有测,如果count比buffer的长度大会怎么样呢?我猜的是会丢失部分数据。
这,结果和我预期的相反,所有的数据还是全部在buffer里面了,不行我得查一下为啥:后来我试了一下,发现在freebsd上和centos上测试的结果不一样。
read时,如果fd中的数据如果小于要读取的数据,就会引起阻塞,这是啥意思啊。
read在读不同的数据时候的行为不一样,这个要注意。
比如普通文件,管道,socket