第四节 输入与输出

上次的笔记中写到的 open, read, write, lseek 以及close ,都是不带缓存的IO函数,这些函数都使用文件描述符进行工作。

上一篇笔记用到的 read(STDIN_FILENO, buf, BUFFSIZE)write(STDOUT_FILENO, buf, n) 函数中的2个参数 STDIN_FILENOSTDOUT_FILENO 是 __POSIX__标准的一部分,很多函数原型都在其中,这2个参数定义在 <unistd.h> 头文件中,他们是标准输入输出的文件描述符,大部分情况下他们都是0 和1,为了保证可移植以及兼容性问题,很多api中都不使用c原生的数据类型,所以我们使用了它的一个可以替代的宏。

read 函数返回读取到的字节数,这个值用来当作__write__ 函数的第二个参数, 当到达文件的末尾时,read返回0, 这个时候程序正常终止运行,如果发生错误则返回 -1 。

标准IO

标准 IO 函数提供了对不支持缓存的原生 IO 函数带 缓存的界面,使用标准IO函数不用担心BUFFSIZE大小的问题,因为它总能获取准确并合适的长度, 进一段原文中的例子程序.

#include <stdio.h>
int
main(void)
{
int c;
while((c = getc(stdin)) != EOF)
{
if(putc(c, stdout) == EOF)
{
printf("output error");
}
}
if(ferror(stdin))
{
printf("input error");
}
exit(0);
}

该程序非常容易理解,getc() 不停的从标准输入读取数据,putc 则不停的把输入的数据反馈到标准输入, 这几个api的原型都在 __stdio.h__头文件中, 文章末尾会分析每次遇到的api。

程序与进程####

程序

程序并不是进程,程序只有在运行的时候才会存在于进程之中, 当磁盘上的某个可执行文件被内核载入内存并且执行之后才会形成进程,内核使用6个exec函数中的一个来载入可执行程序。

进程和进程ID

程序执行的实例被称为进程(process),有的书中也叫做任务,用任务和进程来表示运行状态中的可执行程序,都是可以理解的。unix系统中的每一个进程都通过一个进程标示符来区分,这个由数字组成的符号被称做 进程ID, 是一个非负整数。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int
main(void)
{
pid_t pid = getpid();
printf("hello world from process ID :%d \n", pid);
exit(0);
}

===========================

unix api解析
 stdio.h
int getc(FILE *stream)
该函数的功能是从文件流中读取下一个字符,并且以无符号整数返回,也可能返回文件末尾标识和错误信息。 stdio.h
int putc(int c, FILE *stream);
该函数用于向文件流写入一个字符。
c : 要写入的字符,整形, 写入的时候会自动转换为无符号字符型
stream : 要写入的文件指针。
返回值: 写入的字符转换成整形后的值,发生错误则返回EOF 该函数有可能是用宏定义实现的。
sys/types.h
unistd.h
pid_t getpid()
该函数用来返回当前进程的ID。

unix 环境高级编程-读书笔记与习题解答-第二篇的更多相关文章

  1. unix环境高级编程-读书笔记与习题解答-第一篇

    从这周开始逐渐的进入学习状态,每天晚上都会坚持写c程序,并且伴随对这本书的深入,希望能写出更高质量的读书笔记和程序. 本书的第一章,介绍了一些关于unix的基础知识,在这里我不想去讨论linux到底是 ...

  2. unix 环境高级编程 读书笔记与习题解答第四篇

    第一章 第六节 第一小节 这一章没有程序设计和API方面的深入学习,而是注重介绍了unix操作系统中的原始数据类型和系统原型函数,错误处理方面的知识. ____unistd.h____ 该文件包含了u ...

  3. [置顶] 文件和目录(二)--unix环境高级编程读书笔记

    在linux中,文件的相关信息都记录在stat这个结构体中,文件长度是记录在stat的st_size成员中.对于普通文件,其长度可以为0,目录的长度一般为1024的倍数,这与linux文件系统中blo ...

  4. [置顶] 文件io(一)--unix环境高级编程读书笔记

    unix-like(后面以linux为例)系统中的文件操作只需要五个函数就足够了,open.close.read.write以及lseek.这些操作被称为不带缓存的io,这里有必要说一下带缓存和不带缓 ...

  5. unix进程的环境--unix环境高级编程读书笔记

    http://blog.csdn.net/xiaocainiaoshangxiao/article/category/1800937

  6. unix环境高级编程 读书笔记

    1.上班业余时间把书下载下来,第一章读完了,但是程序只能回家运行啦!Fighting!

  7. unix-环境高级编程-读书笔记与习题解答-第三篇

    第一章 第五节 进程与控制 该小节比较粗略的阐述了unix操作系统中用于进程控制的三个函数,分别为 : fork , exec, waitpid, 其中 exec 有五种变体, 这些变体实现的功能全部 ...

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

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

  9. 《UNIX环境高级编程》笔记--UNIX标准化及实现

    1.UNIX标准化 1.1.ISO C 1989 年后期,C程序设计语言的ANSI(American National Standards Institute) 标准X3. 15 9-1989得到批准 ...

随机推荐

  1. 600字读懂 Git

    译注:来自 Hacker School 的 Mary Rose Cook 实现了一个纯 JavaScript 写就的 Git:Gitlet,包含了最主要的一些命令.这个项目一是为了了解 Git 内部原 ...

  2. Linq to sql语法

    LINQ to SQL语句(1)之Where Where操作 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子 ...

  3. 【转】eclipse使用git提交到osc

    转自:http://my.oschina.net/gaowm/blog/271623 目录[-] 一.Git下载 二.Git安装 三.设置用户名和密码 四.准备代码库 五.创建本地仓库 六.eclip ...

  4. java 微信公众服务平台 下发 模板消息

    java 微信公众服务平台 下发 模板消息 (一).部分截图 (二).部分代码 (一).部分截图: (二).部分代码: //此处 给用户微信发消息... Map<String,String> ...

  5. Mina学习之Codec Filter

    为何要使用Codec Filter 1. 任何一个网络应用程序接受到消息后,都需要知道消息的开头和结束. 2. 你可以把协议解析的部分放在IoHandler,但这样就会造成业务代码和协议解析代码混淆在 ...

  6. JS时钟钟表

    <!DOCTYPE html> <html>    <head>        <meta charset="utf-8" />   ...

  7. 数据库中存储日期的字段类型究竟应该用varchar还是datetime ?

    背景: 前段时间在百度经验看到一篇文章<如何在电脑右下角显示你(爱人)的名字>,之前也听过这个小技巧,但没真正动手设置过.所以出于好奇就实践了一下. 设置完成后的效果例如以下.右下角的时间 ...

  8. 小猪的Android入门之路 Day 3 - part 3

    小猪的Android入门之路 Day 3 - part 3 各种UI组件的学习 Part 3 本节引言: 在前面两个部分中我们对Android中一些比較经常使用的基本组件进行了一个了解, part 1 ...

  9. jsp页面使用javascript添加页面元素示例代码

    <body>    <input type="button" value="test" onclick="javascript:a( ...

  10. Java——(六)Collection之Queue集合

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- Queue集合 Queue集合用于模拟队列这种数据结构,队列通常是指“先进先出‘(FIFO)的容 ...