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

Unix系统编程(五)read系统调用的更多相关文章

  1. 《Linux/Unix系统编程手册》读书笔记9(文件属性)

    <Linux/Unix系统编程手册>读书笔记 目录 在Linux里,万物皆文件.所以文件系统在Linux系统占有重要的地位.本文主要介绍的是文件的属性,只是稍微提及一下文件系统,日后如果有 ...

  2. 《Linux/Unix系统编程手册》读书笔记8 (文件I/O缓冲)

    <Linux/Unix系统编程手册>读书笔记 目录 第13章 这章主要将了关于文件I/O的缓冲. 系统I/O调用(即内核)和C语言标准库I/O函数(即stdio函数)在对磁盘进行操作的时候 ...

  3. 《Linux/Unix系统编程手册》读书笔记7 (/proc文件的简介和运用)

    <Linux/Unix系统编程手册>读书笔记 目录 第11章 这章主要讲了关于Linux和UNIX的系统资源的限制. 关于限制都存在一个最小值,这些最小值为<limits.h> ...

  4. 《Linux/Unix系统编程手册》读书笔记5

    <Linux/Unix系统编程手册>读书笔记 目录 第8章 本章讲了用户和组,还有记录用户的密码文件/etc/passwd,shadow密码文件/etc/shadow还有组文件/etc/g ...

  5. 《Linux/Unix系统编程手册》读书笔记4

    <Linux/Unix系统编程手册>读书笔记 目录 第7章: 内存分配 通过增加堆的大小分配内存,通过提升program break位置的高度来分配内存. 基本学过C语言的都用过mallo ...

  6. 《Linux/Unix系统编程手册》读书笔记1

    <Linux/Unix系统编程手册>读书笔记 目录 最近这一个月在看<Linux/Unix系统编程手册>,在学习关于Linux的系统编程.之前学习Linux的时候就打算写关于L ...

  7. 《Linux/Unix系统编程手册》读书笔记2

    <Linux/Unix系统编程手册>读书笔记 目录 第5章: 主要介绍了文件I/O更深入的一些内容. 原子操作,将一个系统调用所要完成的所有动作作为一个不可中断的操作,一次性执行:这样可以 ...

  8. 《Linux/Unix系统编程手册》 时间子系统

    Linux下操作系统编程有两本经典APUE即<Advanced Programming in the UNIX Environment>和TLPI<The Linux Program ...

  9. 《Linux/UNIX系统编程手册》第63章 IO多路复用、信号驱动IO以及epoll

    关键词:fasync_helper.kill_async.sigsuspend.sigaction.fcntl.F_SETOWN_EX.F_SETSIG.select().poll().poll_wa ...

  10. 学习《Unix/Linux编程实践教程》(1):Unix 系统编程概述

    0.目录 1.概念 2.系统资源 3.学习方法 4.从用户的角度来理解 Unix 4.1 登录--运行程序--注销 4.2 目录操作 4.3 文件操作 5.从系统的角度来理解 Unix 5.1 网络桥 ...

随机推荐

  1. 【Python】解决Django Admin管理界面样式表(CSS Style)丢失问题

    配置Django Admin,关于如何启用请参考Django官方文档<Activate the admin site>.但是我在配置过程中登录http://example.com/admi ...

  2. 【云计算】OpenStack项目全面介绍

    关于OpenStack孵化项目trove(DBaaS)之我见:http://blog.csdn.net/ddl007/article/details/17253751 OpenStack Trove将 ...

  3. Elasticsearch的javaAPI之query dsl-queries

    Elasticsearch的javaAPI之query dsl-queries 和rest query dsl一样,elasticsearch提供了一个完整的Java query dsl. 查询建造者 ...

  4. XUtils3框架的初始体验(一)

    1.开源地址       https://github.com/wyouflf/xUtils3.git    如果使用eclipse可以 点击这里下载aar文件, 然后用zip解压, 取出jar包和s ...

  5. ASP.NET MVC & Web API Brief Introduction

    Pure Web Service(ASMX): Starting back in 2002 with the original release of .NET, a developer could f ...

  6. FEC

    什么是FEC http://zhidao.baidu.com/link?url=sbk7ue4n75HCbumrznBlAwdZAII8ZK2Xp3HTJ5BRkLJtDLFN3MGp9KOlrHVp ...

  7. 小程序 的 textarea 组件 层级问题如何解决

        像这样的   既然是定位(脱离文档流),为啥不加层级关系,层级关系不明确,很容易出现显示异常,给遮罩加z-index:10,弹出框加z-index:11 即可 解决方案参考: https:// ...

  8. canvas锯齿

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. 05-hibernate注解-多对一单向外键关联

    多对一单向外键 1,多方持有一方的引用,比如:多个学生对应一个班级(多对一) 2,@ManyToOne(cascade={CascadeType.ALL},  fetch=FetchType.EAGE ...

  10. iOS UITableView获取特定位置的cell

    代码地址如下:http://www.demodashi.com/demo/13307.html 一.tableView双级联动 以上两种效果比较类似,实现的关键在于都是需要获得在滑动过程中滑动到tab ...