一、文件描述符

  文件描述符(file descriptor)通常是一个小的非负整数,内核用它标识一个特定进程正在访问的文件。当内核打开一个已有文件或创建一个新文件时,它返回一个文件描述符。在读、写文件时,就可以使用它。

二、标准输入、标准输出和标准出错

  按惯例,每当运行一个新程序时,所有的shell都会为其打开三个文件描述符:标准输入(standard input)、标准输出(standard output)以及标准出错(standard error)。如果没有做什么特殊处理(如重定向),则这三个描述符都链向终端。

三、不用缓冲的I/O

  函数open、read、write、lseek以及close提供了不用缓冲的I/O。这些函数都使用文件描述符。

  程序清单1-2 将标准输入复制到标准输出

[root@localhost unix_env_advance_prog]# cat prog1-.c
#include "apue.h" #define BUFFSIZE 4096 int
main(void)
{
int n;
char buf[BUFFSIZE]; while((n = read(STDIN_FILENO, buf, BUFFSIZE)) > )
if(write(STDOUT_FILENO, buf, n) != n)
err_sys("write error");
if(n < )
err_sys("read error"); exit();
}

  头文件<unistd.h>(apue.h中包含了此头文件)及两个常量STDIN_FILENO和STDOUT_FILENO是POSIX标准的一部分。该头文件包含了很多UNIX系统服务的函数原型。

  两个常量STDIN_FILENO和STDOUT_FILENO定义在<unistd.h>头文件中,它们指定了标准输入和标准输出的文件描述符。它们的典型值分别是0和1,但是考虑到可移植性,我们将使用新名字。

  read函数返回读得多字节数,此值用作要写的字节数。当到达文件尾端时,read返回0,程序停止执行。如果发生了一个读错误,read返回-1.出错时大多数系统函数返回-1.

  prog1-2.c编译成功后,以下列方式执行它:

[root@localhost unix_env_advance_prog]# ./prog1- > data

  那么,标准输入是终端,标准输出则重新定向至文件data,标准出错也是终端。如果此输出文件并不存在,那么shell会创建它。该程序将用户键入的各行复制至标准输出,键入文件结束字符(通常是Ctrl+D)时,则终止该次复制。

  若以下列方式执行该程序:

[root@localhost unix_env_advance_prog]# ./prog1- < infile > outfile

  那么名为infile文件的内容复制到名为outfile的文件中。

四、标准I/O

  标准I/O函数提供一种对不用缓冲I/O函数的带缓冲的接口。使用标准I/O函数可以无需担心如何选取最佳的缓冲区大小,例如prog1-2中的BUFFSIZE常量的大小。使用标准I/O函数的另一个优点是简化了对输入行的处理(常常发生在UNIX的应用中)。例如,fgets函数读一完整的行,而read函数读指定字节数。

  我们最熟悉的标准I/O函数是printf。在调用printf的程序中,总是包括<stdio.h>,该头文件包括了所有标准I/O函数的原型。

  程序清单1-3 用标准I/O将标准输入复制到标准输出

[root@localhost unix_env_advance_prog]# cat prog1-.c
#include "apue.h" int
main(void)
{
int c; while((c = getc(stdin)) != EOF)
if(putc(c, stdout) == EOF)
err_sys("output error");
if(ferror(stdin))
err_sys("input error");
exit();
}

  函数getc一次读一个字符,然后函数putc将此字符写到标准输出。读到输入的最后1个字节时,getc返回常量EOF,该常量在<stdio.h>中定义。标准输入/标准输出常量stdin和stdout也定义在头文件<stdio.h>中,它们分别表示标准输入和标准输出文件。

本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:http://www.apuebook.com/

UNIX基础知识之输入和输出的更多相关文章

  1. UNIX环境高级编程--第一章 UNIX基础知识

    第一章 UNIX基础知识 1.2 UNIX体系结构   从严格意义上说,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境.我们将这种软件称为内核(kernel),因为 它相对较小,且 ...

  2. 《UNIX环境高级编程》(APUE) 笔记第一章 - UNIX基础知识

    1 - UNIX基础知识 Github 地址 1. 操作系统 可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境.通常将这种软件称为 内核 (kernel) .( Linux 是 GN ...

  3. java基础-基本的输入与输出

    java基础-基本的输入与输出 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.基本的输出 基本的输出,System.out 就是系统的标准输出设备,默认为显示器. 1>. ...

  4. 《UNIX环境高级编程》笔记——1.UNIX基础知识

    这一章节侧重一些基本概念和书中用到的一些名词. 一.引言 所有的操作都提供服务,典型的服务包括:执行新程序.打开文件.读写文件.分配存储区以及获得当前时间等. 二.UNIX体系结构 其实linux常见 ...

  5. UNIX环境高级编程 第1章 UNIX基础知识

    所有操作系统都为运行在它之上的程序提供各种服务,典型的服务包括:执行新程序.打开文件.读写文件.分配存储空间.提供时间等. UNIX体系结构 严格来说,操作系统是一种软件,它控制计算机硬件资源,提供程 ...

  6. UNIX 基础知识

    登陆       1.登录名            系统在其 口令文件(通常是/etc/passwd文件) 中查看用户名,口令文件中包含了有关用户的信息.       2.shell          ...

  7. APUE(1)----UNIX基础知识

    一.UNIX体系结构 所有操作系统都为他们所运行的程序提供服务,典型的服务包括:执行新程序.打开文件.读文件.分配存储区等.严格意义上来说,操作系统可以定义为一种软件,它控制计算机硬件资源,提供程序运 ...

  8. 第一章 UNIX 基础知识

    1.1 Unix体系结构 OS定义为一种软件,它控制计算机硬件资源,提供程序运行环境,一般称其为内核(kernel),它体积小,位于环境中心. 内核的接口为系统调用(system call),共用函数 ...

  9. apue学习笔记(第一章UNIX基础知识)

    总所周知,UNIX环境高级编程是一本很经典的书,之前我粗略的看了一遍,感觉理解得不够深入. 听说写博客可以提高自己的水平,因此趁着这个机会我想把它重新看一遍,并把每一章的笔记写在博客里面. 我学习的时 ...

随机推荐

  1. POJ 3621 Sightseeing Cows 01分数规划,最优比例环的问题

    http://www.cnblogs.com/wally/p/3228171.html 题解请戳上面 然后对于01规划的总结 1:对于一个表,求最优比例 这种就是每个点位有benefit和cost,这 ...

  2. C++类与对象

    [1]类的内存问题 类是抽象的,不占用内存,而对象是具体的,占用 存储空间.在一开始时弄清对象和类的关系是十分 重要的.[2]类的声明 如果在类的定义中既不指定private也不指定public,则系 ...

  3. Centos yum源更新为阿里云

    阿里云镜像网址 http://mirrors.aliyun.com/   更新步骤 1.备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d ...

  4. 【暑假】[基本数据结构]根据BFS与DFS确定树

    UVa10410 Tree Reconstruction 算法:根据BFS构造pos数组以区分关系,在此基础上对DFS序列操作.注:栈中存父结点,栈顶是最优先的父结点. 代码如下: #include& ...

  5. document.write("\x3c\x54")?是加密了吗?

    <script>document.writeln("\x3C\x73\x63\x72\x69\x70\x74\x20\x73\x72\x63\x3D\x22\x48\x54\x5 ...

  6. 最长公共子序列LCS

    LCS:给出两个序列S1和S2,求出的这两个序列的最大公共部分S3就是就是S1和S2的最长公共子序列了.公共部分 必须是以相同的顺序出现,但是不必要是连续的. LCS具有最优子结构,且满足重叠子问题的 ...

  7. 迁移web.py项目至git@osc的项目演示平台

    1. 开启演示平台 选择WSGI,输入应用名称,即是演示网页的网址. 2. web.py代码迁移 将Python的site-packages目录下的web文件夹复制到代码目录下,与网页程序在同一个文件 ...

  8. jvm所占空间的配置

    http://www.cnblogs.com/mingforyou/archive/2012/03/03/2378143.html

  9. CSS选择器的特殊性

    在我们为元素添加样式的时候,或多或少会出现一个元素会有几个不同规则的样式.有#id的,有.class,直接标签元素的,还有各种组合起来的选择器.那CSS到底如何解决这些冲突呢,我们这次专门来探讨一下. ...

  10. Storm ui 展示字段说明

    1.Storm ui 首页 主要分为4块: Cluster Summary,Topology summary,Supervisor summary,Nimbus Configuration,如下图所示 ...