输入和输出

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环境高级编程》学习心得 三的更多相关文章

  1. UNIX环境高级编程(第三版)关于apue.h的用法

    UNIX环境高级编程(第三版)中的例子用到apue.h这个头文件,但是书里面写的地址已经不能访问. 经过一番查找之后,找到如下解决方案: 1.到www.apuebook.com上下载第2版的源码,也可 ...

  2. Unix环境高级编程学习笔记——fcntl

    写这篇文正主要是为了介绍下fcntl,并将我自己在学习过程中的一些理解写下来,不一定那么官方,也有错误,希望指正,共同进步- fcntl: 一个修改一打开文件的性质的函数.基本的格式是 int fcn ...

  3. Unix环境高级编程学习笔记——dup

    dup 和 dup2   dup和dup2,都是用来将一个文件描述符复制给另一个文件描述符上,这两个文件描述符都指向同一个文件状态标志上. 只是文件描述符的大小不一样,dup所执行下的复制,肯定是返回 ...

  4. [UNIX环境高级编程](第三版)中apue.h的问题

    编译 gcc -g myls.c 时,报错 ‘找不到头文件 apue.h’ apue.h是作者自己写的一个文件,系统不自带.其中包含了常用的头文件,以及出错处理函数的定义. 需要到 http://ww ...

  5. Unix环境高级编程—进程控制(三)

    一.解释器文件 解释器文件属于文本文件,起始行形式为: #! pathname[optional-argument] 我们创建一个只有一行的文件如下: #!/home/webber/test/echo ...

  6. UNIX环境高级编程学习笔记(十)为何 fork 函数会有两个不同的返回值【转】

    转自:http://blog.csdn.net/fool_duck/article/details/46917377 以下是基于 linux 0.11 内核的说明. 在init/main.c第138行 ...

  7. 关于UNIX/Linux下安装《UNIX环境高级编程》源代码的问题

    <UNIX环境高级编程(第三版)>是一本广为人知的unix系统编程书籍. 但是,书中的代码示例,要想正确的编译运行,要先做好准备工作: 1.下载源代码 传送门:http://apueboo ...

  8. (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  9. 【转】apue《UNIX环境高级编程第三版》第一章答案详解

    原文网址:http://blog.csdn.net/hubbybob1/article/details/40859835 大家好,从这周开始学习apue<UNIX环境高级编程第三版>,在此 ...

  10. Unix环境高级编程第三版中实例代码如何在自己的linux上运行的问题

    学习Linux已经有2个月了,最近被期末考试把进度耽误了,前几天把Unix环境高级编程看了两章,感觉对Linux的整体有了一些思路,今天尝试着对第一章涉及到的一个简单的交互式shell编译运行一下,结 ...

随机推荐

  1. 将UIImage保存成JPG或PNG格式存储在本地

    -(void)pngAndJpg:(UIImage*)image{ NSString *pngPath = [NSHomeDirectory() stringByAppendingPathCompon ...

  2. cf754 A. Lesha and array splitting

    应该是做麻烦了,一开始还没A(幸好上一次比赛水惨了) #include<bits/stdc++.h> #define lowbit(x) x&(-x) #define LL lon ...

  3. [置顶] 小强的HTML5移动开发之路(9)——坦克大战游戏3

    上一篇我们创建了敌人的坦克和自己的坦克,接下来就应该让坦克发子弹了,我们下面来看一下如何让我们的坦克发出子弹. 前面我们用面向对象的思想对Tank进行了封装,又利用对象冒充实现了我们的坦克和敌人的坦克 ...

  4. 完整Deploy WebPlayer的Config

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...

  5. 基于Emgu cv的图像拼接(转)

    分类: 编程 C# Emgu cv Stitching 2012-10-27 11:04 753人阅读 评论(1) 收藏 举报 在新版本的Emgu cv中添加了Emgu.CV.Stitching,这极 ...

  6. (剑指Offer)面试题15:链表中倒数第k个结点

    题目: 输入一个链表,输出该链表中倒数第k个结点. 例如:链表中有6个结点,从头到尾依次为1,2,3,4,5,6,则该链表的倒数第3个结点为4. 链表结点定义: struct ListNode{ in ...

  7. Hadoop ecosystem

    How did it all start- huge data on the web! Nutch built to crawl this web data Huge data had to save ...

  8. IDA Script: Remove empty auto labels

    http://simeonpilgrim.com/blog/2010/03/25/ida-script-remove-empty-auto-labels/ #include <idc.idc&g ...

  9. Car immobilizer hacking

    Karsten Nohl <nohl@srlabs.de>

  10. VPW Communication Protocol

    http://www.fastfieros.com/tech/vpw_communication_protocol.htm Breakdown of the j1850 3 byte Header f ...