Unix系统编程(五)read系统调用
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系统调用的更多相关文章
- 《Linux/Unix系统编程手册》读书笔记9(文件属性)
<Linux/Unix系统编程手册>读书笔记 目录 在Linux里,万物皆文件.所以文件系统在Linux系统占有重要的地位.本文主要介绍的是文件的属性,只是稍微提及一下文件系统,日后如果有 ...
- 《Linux/Unix系统编程手册》读书笔记8 (文件I/O缓冲)
<Linux/Unix系统编程手册>读书笔记 目录 第13章 这章主要将了关于文件I/O的缓冲. 系统I/O调用(即内核)和C语言标准库I/O函数(即stdio函数)在对磁盘进行操作的时候 ...
- 《Linux/Unix系统编程手册》读书笔记7 (/proc文件的简介和运用)
<Linux/Unix系统编程手册>读书笔记 目录 第11章 这章主要讲了关于Linux和UNIX的系统资源的限制. 关于限制都存在一个最小值,这些最小值为<limits.h> ...
- 《Linux/Unix系统编程手册》读书笔记5
<Linux/Unix系统编程手册>读书笔记 目录 第8章 本章讲了用户和组,还有记录用户的密码文件/etc/passwd,shadow密码文件/etc/shadow还有组文件/etc/g ...
- 《Linux/Unix系统编程手册》读书笔记4
<Linux/Unix系统编程手册>读书笔记 目录 第7章: 内存分配 通过增加堆的大小分配内存,通过提升program break位置的高度来分配内存. 基本学过C语言的都用过mallo ...
- 《Linux/Unix系统编程手册》读书笔记1
<Linux/Unix系统编程手册>读书笔记 目录 最近这一个月在看<Linux/Unix系统编程手册>,在学习关于Linux的系统编程.之前学习Linux的时候就打算写关于L ...
- 《Linux/Unix系统编程手册》读书笔记2
<Linux/Unix系统编程手册>读书笔记 目录 第5章: 主要介绍了文件I/O更深入的一些内容. 原子操作,将一个系统调用所要完成的所有动作作为一个不可中断的操作,一次性执行:这样可以 ...
- 《Linux/Unix系统编程手册》 时间子系统
Linux下操作系统编程有两本经典APUE即<Advanced Programming in the UNIX Environment>和TLPI<The Linux Program ...
- 《Linux/UNIX系统编程手册》第63章 IO多路复用、信号驱动IO以及epoll
关键词:fasync_helper.kill_async.sigsuspend.sigaction.fcntl.F_SETOWN_EX.F_SETSIG.select().poll().poll_wa ...
- 学习《Unix/Linux编程实践教程》(1):Unix 系统编程概述
0.目录 1.概念 2.系统资源 3.学习方法 4.从用户的角度来理解 Unix 4.1 登录--运行程序--注销 4.2 目录操作 4.3 文件操作 5.从系统的角度来理解 Unix 5.1 网络桥 ...
随机推荐
- mongodb多表查询(附带pymongo实例)
mongodb有$lookup可以做多表查询 举个例子 数据如下 db.orders.insert([ { , , }, { , , }, { } ]) db.inventory.insert([ { ...
- ORA-04030
ORA-04030: 在尝试分配...字节(...)时进程内存不足的原因分析及解决办法 正在使用的oracle 11g数据库,前天在用一段时间后(开始要较长时间才出现,后来较短时间就出现),频繁报OR ...
- Python爬虫之一 PySpider 抓取淘宝MM的个人信息和图片
ySpider 是一个非常方便并且功能强大的爬虫框架,支持多线程爬取.JS动态解析,提供了可操作界面.出错重试.定时爬取等等的功能,使用非常人性化. 本篇通过做一个PySpider 项目,来理解 Py ...
- [Functional Programming ADT] Combine Multiple State ADT Based Redux Reducers
Redux provides a convenient helper for combining many reducers called combineReducer, but it focuses ...
- ListView改变字体
ListView中没有改变字体的属性和方法,所以需要用其他的方式.这里使用ArrayAdapter. 首先,创建一个TextView组件,用来作为Adapter的列表项组件. 在layout文 ...
- 金蝶随手记团队分享:还在用JSON? Protobuf让数据传输更省更快(实战篇)
本文作者:丁同舟,来自金蝶随手记技术团队. 1.前言 本文接上篇<金蝶随手记团队分享:还在用JSON? Protobuf让数据传输更省更快(原理篇)>,以iOS端的Objective-C代 ...
- Json 简易教程
一.什么是Json JSON的全称是"JavaScript Object Notation",意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式 ...
- 镜像上传和Dockerfile
一.镜像上传 1.在https://hub.docker.com 注册一个账号 2.创建一个仓库 3.取到containerID #docker ps 4.commit容器 #docker commi ...
- 经常使用的 WEB server
对于刚開始学习的人来说,或许自己能够写出一些简单的演示样例DEMO,但却纠结于不知道应该怎样才干訪问自己的页面,这里进行了一些简单的WEBserver总结.便于新朋友配置使用 静态HTML页面 对于静 ...
- Creating, detaching, re-attaching, and fixing a SUSPECT database
今天遇到一个问题:一个数据库suspect了.然后又被用户detach了. 1,尝试将数据库attach回去,因为log file损坏失败了. 2,尝试将数据库attach回去,同一时候rebuild ...