《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编译运行一下,结 ...
随机推荐
- 将UIImage保存成JPG或PNG格式存储在本地
-(void)pngAndJpg:(UIImage*)image{ NSString *pngPath = [NSHomeDirectory() stringByAppendingPathCompon ...
- cf754 A. Lesha and array splitting
应该是做麻烦了,一开始还没A(幸好上一次比赛水惨了) #include<bits/stdc++.h> #define lowbit(x) x&(-x) #define LL lon ...
- [置顶] 小强的HTML5移动开发之路(9)——坦克大战游戏3
上一篇我们创建了敌人的坦克和自己的坦克,接下来就应该让坦克发子弹了,我们下面来看一下如何让我们的坦克发出子弹. 前面我们用面向对象的思想对Tank进行了封装,又利用对象冒充实现了我们的坦克和敌人的坦克 ...
- 完整Deploy WebPlayer的Config
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...
- 基于Emgu cv的图像拼接(转)
分类: 编程 C# Emgu cv Stitching 2012-10-27 11:04 753人阅读 评论(1) 收藏 举报 在新版本的Emgu cv中添加了Emgu.CV.Stitching,这极 ...
- (剑指Offer)面试题15:链表中倒数第k个结点
题目: 输入一个链表,输出该链表中倒数第k个结点. 例如:链表中有6个结点,从头到尾依次为1,2,3,4,5,6,则该链表的倒数第3个结点为4. 链表结点定义: struct ListNode{ in ...
- Hadoop ecosystem
How did it all start- huge data on the web! Nutch built to crawl this web data Huge data had to save ...
- IDA Script: Remove empty auto labels
http://simeonpilgrim.com/blog/2010/03/25/ida-script-remove-empty-auto-labels/ #include <idc.idc&g ...
- Car immobilizer hacking
Karsten Nohl <nohl@srlabs.de>
- VPW Communication Protocol
http://www.fastfieros.com/tech/vpw_communication_protocol.htm Breakdown of the j1850 3 byte Header f ...