《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编译运行一下,结 ...
随机推荐
- JQuery EasyUI弹出对话框解决Asp.net服务器控件无法执行后台代码的方法(转)
原文:JQuery EasyUI弹出对话框解决Asp.net服务器控件无法执行后台代码的方法 jquery-easyui是一个基于jquery的图形界面插件,利用easyui可以创建很多好看的网页界面 ...
- Rank() over(partition ... 分组统计的实例
USE [NanFeng]GO/****** Object: StoredProcedure [dbo].[st_MES_RptMaterilSum] Script Date: 04/18/2016 ...
- [翻译]比较ADO.NET中的不同数据访问技术(Performance Comparison:Data Access Techniques)
Performance Comparison: Data Access Techniques Priya DhawanMicrosoft Developer Network January 2002 ...
- CFileDialog 、CFile 如何进行文件操作 [转]
如何进行文件操作 [1]显示对话框,取得文件名 CString FilePathName; CFileDialog dlg(TRUE);//TRUE为OPEN对话框,FALSE为SAVE AS对话框 ...
- myeclipse中working Sets
最近myeclipse中的项目太多了,看起来老不爽,查找还不方便,发现这个working Sets还是挺好用的 接下来的步骤,太简单了有木有,就不写了 0.0
- Form实现主从块金额汇总
1.FORM使用app_calculate.running_total汇总行金额,行上有编码重复验证. 情况一:当录入多个编码重复的行并保存时,报错,清除一个重复行再保存(头行金额一致),报错&quo ...
- Codeforces Round #290 (Div. 2) B. Fox And Two Dots dfs
B. Fox And Two Dots 题目连接: http://codeforces.com/contest/510/problem/B Description Fox Ciel is playin ...
- C#基本线程同步
0 概述 所谓同步,就是给多个线程规定一个执行的顺序(或称为时序),要求某个线程先执行完一段代码后,另一个线程才能开始执行. 第一种情况:多个线程访问同一个变量: 1. 一个线程写,其它线程读:这种情 ...
- 由linux内核某个片段(container_of)引发的对于C语言的深入理解
/usr/src/linux-source-3.8.0/drivers/gpu/drm/radeon 这个文件夹以下 去找到这个文件 mkregtable.c 打开,就能够看到了. #define ...
- 【React Native 实战】二维码扫描
1.前言今天介绍React Native来实现二维码扫描的功能.首先我们要借助第三方插件react-native-barcode-scanner-universal来实现跨平台二维码扫描. 2.介绍 ...