《UNIX环境高级编程》学习心得 三
输入和输出
1、文件描述符
文件描述符(file descriptor)可以理解为内核在某个进程中访问一个文件时,内核向进程返回的一个非负整数。在内核使用open或creat打开一个现有文件或者创建一个新文件时,它都会返回一个文件描述符,并将其作为参数给read或者write用。
2、标准输入、标准输出和标准错误
按惯例,每当运行一个新程序时,所有的shell都为其打开三个文件描述符(0、1、2),即标准输入(standard input)、标准输出(standard output)以及标准错误(standard error)。
我的理解:
标准输入就是从终端(Terminal)对应的键盘中输入,标准输出应该就是直接在终端的屏幕上输出,标准错误也是直接显示在终端屏幕上的。
3、不带缓冲的I/O
函数 open、read、write、lseek和close提供了不带缓冲的I/O。这些函数都使用文件描述符。
不带缓冲的I/O指的应该是这些函数是直接进行系统调用,就是用户使用的时候需要自己建立一个缓冲区,然后自己对这个缓冲区进行管理。而标准I/O呢,应该就是系统自己在用户层上建立了一个缓冲区,不需要用户创建,而且这个缓冲区的管理算法是大牛们写好的,非常高效,应该是比一般用户手撕缓冲区高效的多。
有网友总结的数据流向路径是这样的:
无缓存IO操作数据流向路径:数据——内核缓存区——磁盘
标准IO操作数据流向路径:数据——流缓存区——内核缓存区——磁盘
书中有这样的实例
#include "apue.h" #define BUFFSIZE 4096 //缓冲区的长度 int
main(void)
{
int n;
char buf[BUFFSIZE]; //用户自己弄的缓冲区 while ((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0) // STDIN_FILENO 就是标准输入的文件描述符 值为0 //这条语句就是从标准输入里读
if (write(STDOUT_FILENO, buf, n) != n) // STDOUT_FILENO 就是标准输出的文件描述符 值为1//这条语句就是写入标准输出
err_sys("write error"); //err_sys 是大师自己写的一个出错处理 if (n < 0)
err_sys("read error"); exit(0);
}
这个例子呢就是使用不带缓冲的I/O从标准输入读,并向标准输出写。
#include "apue.h" int
main(void)
{
int c; while ((c = getc(stdin)) != EOF) // stdin表示标准输入
if (putc(c, stdout) == EOF) //stdout表示标准输出 与stdin一同在头文件<stdio.h>中定义的
err_sys("output error"); if (ferror(stdin))
err_sys("input error"); exit(0);
}
这个例子呢就是使用标准I/O从标准输入读入数据并写到标准输出中去。这里面有个EOF,EOF呢在<stdio.h>头文件里定义,值为-1。getc就是标准I/O函数,函数getc()用于从流中取字符,其原型是 int getc(FILE *stream); 参数*steam为要从中读取字符的文件流。它返回的是所读取的字符。当它读到文件尾而无数据时便返回-1(EOF)。
由于EOF的值为-1,所以也有如下写法:
while(~getc()){
}
-1的的反码为0,所以该函数在读到文件结束会停止该循环。
《UNIX环境高级编程》学习心得 三的更多相关文章
- UNIX环境高级编程(第三版)关于apue.h的用法
UNIX环境高级编程(第三版)中的例子用到apue.h这个头文件,但是书里面写的地址已经不能访问. 经过一番查找之后,找到如下解决方案: 1.到www.apuebook.com上下载第2版的源码,也可 ...
- Unix环境高级编程学习笔记——fcntl
写这篇文正主要是为了介绍下fcntl,并将我自己在学习过程中的一些理解写下来,不一定那么官方,也有错误,希望指正,共同进步- fcntl: 一个修改一打开文件的性质的函数.基本的格式是 int fcn ...
- Unix环境高级编程学习笔记——dup
dup 和 dup2 dup和dup2,都是用来将一个文件描述符复制给另一个文件描述符上,这两个文件描述符都指向同一个文件状态标志上. 只是文件描述符的大小不一样,dup所执行下的复制,肯定是返回 ...
- [UNIX环境高级编程](第三版)中apue.h的问题
编译 gcc -g myls.c 时,报错 ‘找不到头文件 apue.h’ apue.h是作者自己写的一个文件,系统不自带.其中包含了常用的头文件,以及出错处理函数的定义. 需要到 http://ww ...
- Unix环境高级编程—进程控制(三)
一.解释器文件 解释器文件属于文本文件,起始行形式为: #! pathname[optional-argument] 我们创建一个只有一行的文件如下: #!/home/webber/test/echo ...
- UNIX环境高级编程学习笔记(十)为何 fork 函数会有两个不同的返回值【转】
转自:http://blog.csdn.net/fool_duck/article/details/46917377 以下是基于 linux 0.11 内核的说明. 在init/main.c第138行 ...
- 关于UNIX/Linux下安装《UNIX环境高级编程》源代码的问题
<UNIX环境高级编程(第三版)>是一本广为人知的unix系统编程书籍. 但是,书中的代码示例,要想正确的编译运行,要先做好准备工作: 1.下载源代码 传送门:http://apueboo ...
- (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- 【转】apue《UNIX环境高级编程第三版》第一章答案详解
原文网址:http://blog.csdn.net/hubbybob1/article/details/40859835 大家好,从这周开始学习apue<UNIX环境高级编程第三版>,在此 ...
- Unix环境高级编程第三版中实例代码如何在自己的linux上运行的问题
学习Linux已经有2个月了,最近被期末考试把进度耽误了,前几天把Unix环境高级编程看了两章,感觉对Linux的整体有了一些思路,今天尝试着对第一章涉及到的一个简单的交互式shell编译运行一下,结 ...
随机推荐
- Oracle 分区字段数据更新
分区字段是不允许进行update操作的,如果有对分区字段行进update,就会报错——ORA-14402:更新分区关键字列将导致分区的更改. 可以通过打开表的row movement属性来允许对分区 ...
- AS:加载新版本的SWF文件。
方案一: 文件名+版本号,区别对待不同的版本控制,有设定值后会加上_v_x的后缀名.如:加载主文件 main.swf, 被命名为:Main_v_60.swf . 方案二: loader.load(ne ...
- js和jquery中的事件委托
[转+自己的修改] 概念: 什么是事件委托:通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件,委托呢,就是让别人来做,这个事件本来是加在某些元素上的,然而你却 ...
- 你真的会玩SQL吗?实用函数方汇总
http://www.cnblogs.com/zhangs1986/p/4917800.html 实用函数方法 由于有些知识很少被用到,但真需要用时却忘记了又焦头烂额的到处找. 现在将这些‘冷门“却有 ...
- [转]Swift Cheat Sheet
原文:http://kpbp.github.io/swiftcheatsheet/ A quick cheat sheet and reference guide for Apple's Swift ...
- cocos2d-x如何新建一个模板项目
方法一: $ cd cocos2d-x$ ./setup.py$ source FILE_TO_SAVE_SYSTEM_VARIABLE$ cocos new MyGame -p com.your_c ...
- [Node.js] Broswerify -- 1
Browserify is a tool that brings node.js style development to the browser. The thing you can see on ...
- 《TCP/IP具体解释卷2:实现》笔记--IP多播
D类IP地址(224.0.0.0到239.255.255.255)不识别互联网内的单个接口,但识别接口组,被称为多播组. 单个网络上的组成员利用IGMP协议在系统之间通信. 多播路由器用多播选录协议. ...
- mysql 升级方法
Performing an In-place Upgrade This section describes how to perform an in-place upgrade. Review Bef ...
- C#“同步调用”、“异步调用”、“异步回调”
本文将主要通过“同步调用”.“异步调用”.“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊. 首先,通过代码定义一个委托和下面三个示例将要调用的方法: ); //模拟该方法运 ...