从这周开始逐渐的进入学习状态,每天晚上都会坚持写c程序,并且伴随对这本书的深入,希望能写出更高质量的读书笔记和程序。

本书的第一章,介绍了一些关于unix的基础知识,在这里我不想去讨论linux到底是不是unix或者和unix的关系是什么这样的问题,只针对对自己有价值的知识点进行分析。

第一节 登录

第一节中,作者叙述了unix下用户登录的基本过程,包括保存用户口令的文件 /etc/passwd , 以及该文件的格式,该口令文件中的登录项的组成结构为由7个冒号分隔的字符串,依次是 :

登录名
加密口令
用户的数字ID
用户的数字组ID
注释字段
用户的起始目录
用户的shell程序
第二节 文件和目录

该节的重点是一个目录操作 api 和 unix 目录的组成以及目录的各种属性的说明,另外也说明了unix中组成目录的可用字符,目录操作api,是入门这本教程中的第一个 api, 也是很常用的一个 api, 在笔记的末尾我会综合讨论本章节所使用的所有 api 的细节。

第三节 输入和输出

程序就是一个算法,算法的操作资料来源于输入,计算完毕之后就必须输出结果给人类才可以,所以输入输出是很重要的基础内容。

unix系统使用文件描述符进行文件操作,类似windows中的句柄(至今不明白翻译成句柄是不是为了更加符合中国人的思维),是一个整数,内核通过这个描述符,进行对文件的各种操作,这个描述符对程序员也很重要,我们在得到这个描述符之后,才可以对文件进行相应的操作。

三个标准文件描述符, 即标准输入,标准输出和错误输出,默认都是终端,由shell默认指配这3个文件描述符,比如 ls 这样的命令, 如果想重定向输出的话, 书中给出了一个简单例子, 就是 使用 > 号, 比如

 ls -al > dir.txt

这样就很简单的把 ls -al 的输出指向到了一个文件里。

接下来书中讲述了基本的io操作api, 并且提供了示例代码,该示例可以复制任意unix文件, 该程序的分析以及api介绍,会在笔记末尾部分。

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

以上章节中所使用的 unix api 解析
头文件
#include <dirent.h>
#include <sys/types.h>
opendir 原型
DIR * opendir(const char * path);
该api 打开一个目录, 打开失败的时候返回 NULL, 目录是文件也会返回NULL, 打开成功则返回一个DIR指针 closedir 原型
int closedir(DIR * dir_handle);
closedir()
关闭参数dir所指的目录流。关闭成功则返回0,失败返回-1,错误原因存于errno 中。EBADF 参数dir为无效的目录流。
注意:目录文件作为一种文件,在打开必须关闭,否则会由于文件的进程打开文件过多而不能打开新的文件。因此opendir函数和closedir函数同样是配对出现的。 DIR 结构体原型 typedef struct __dirstream DIR;
struct __dirstream
{
void *__fd; /* `struct hurd_fd' pointer for descriptor. */
char *__data; /* Directory block. */
int __entry_data; /* Entry number `__data' corresponds to. */
char *__ptr; /* Current pointer into the block. */
int __entry_ptr; /* Entry number `__ptr' corresponds to. */
size_t __allocation; /* Space allocated for the block. */
size_t __size; /* Total valid data in the block. */
__libc_lock_define (, __lock) /* Mutex lock for this structure. */
}; DIRENT 结构体原型
struct dirent
{
long d_ino; /* inode number */
off_t d_off; /* offset to this dirent */
unsigned short d_reclen; /* length of this d_name */
unsigned char d_type; /* the type of d_name */
char d_name [NAME_MAX+1]; /* file name (null-terminated) */
}

书中的示例程序

#include <sys/types.h>
#include <dirent.h>
int
main(int argc, char ** argv)
{
DIR * dir;
struct dirent * dirt;
if(argc != 2)
{
printf(" you need input a dir name");
}
if((dp = opendir(argv[1])) == NULL)
{
printf("can not open %s", argv[1]);
}
while((dirt = readdir(dir)) != NULL)
{
printf("%s\n", dirt->name);
}
closedir(dir);
exit(0)
}

该示例程序是我改写过了的,没由调用书中的头文件,因为我想构造最短小精悍的可以执行的示例程序,程序非常简单,强行分析的话这个程序是漏洞百出的,不过既然是例子就是越简单越能说明问题越好,该程序从终端获取要去读取的目录,打开成功的话就循环读取目录中的文件并打印出来,非常显而易见的 api 调用方法。

头文件
#include <unistd.h>
api 原型
size_t read(int fd, void *buf, size_t count);
返回值:成功返回读取的字节数,出错返回-1并设置errno,如果在调read之前已到达文件末尾,则这次read返回0 #include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
返回值:成功返回写入的字节数,出错返回-1并设置errno

书中的示例程序

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#define BUFFSIZE 8192
int
main(void)
{
int n;
char buf[BUFFSIZE];
while((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0)
{
if(write(STDOUT_FILENO, buf, n) != n)
{
printf("write errors");
}
}
if(n < 0)
{
printf("read error");
}
return 0;
}

当你执行该程序生成的二进制文件的时候,发现你输出什么,它就输出什么,该程序循环调用read 然后 直接write 在while中,可以一直循环读写你输入的内容, 所以该程序可以复制任何unix文件。

gcc -o test ./test.c
cat test.c > ./test > test1.c 你就会发现你的程序被复制到了test1.c中, 该程序并不是让你把所有的文件打在终端里才会复制,书中的意思是要你使用管道来操作。

决定深入的学习linux编程,所以这周开始学习 unix高级环境编程 这本著作, 做服务器端程序设计的程序员,都需要去学习操作系统, 一个服务是否稳定,是否高效,涉及到很多因素,而操作系统是服务运行的环境,各种系统调用,进程通信,IO模型,socket通信,等等这些都是基础,不精通这些东西是没有办法深入服务器端程序设计的,所以我决定认真学习这本书,同时彻彻底底的把django这个框架分析一遍。

这是开头,书中的第一章的内容也很简单,所以这篇笔记主要是说学习计划的,如何有效的学习这本书,或者说适合我的这本书的学习计划,应该有一个大概的规划,我已经经历过无数次无头苍蝇般的学习经历了,这么多年,我觉得应该去变化一下方式了,或者是在方法上面动一下脑筋。

回忆自己以前的学习和工作经历,我的觉悟是,积累是非常重要的,所以更要坚持做笔记,写博客,对于这本书的学习,在一边读的同时,我已经在实践书中的例子程序了,而且我从来不照抄程序,而是完全理解透彻之后,自己查找相应的api,写一个类似书中的程序出来,这样我才能完全理解那些api。

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

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

    第四节 输入与输出 上次的笔记中写到的 open, read, write, lseek 以及close ,都是不带缓存的IO函数,这些函数都使用文件描述符进行工作. 上一篇笔记用到的 read(ST ...

  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. 【内部竞聘】华东/华南 -区域招商高级经理/经理 - 荐才纳贤 - 京东内部论坛 - Powered by Discuz!

    [内部竞聘]华东/华南 -区域招商高级经理/经理 - 荐才纳贤 - 京东内部论坛 - Powered by Discuz! [内部竞聘]华东/华南 -区域招商高级经理/经理   [复制链接]     ...

  2. 2014 牡丹江现场赛 i题 (zoj 3827 Information Entropy)

    I - Information Entropy Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %l ...

  3. 贪心+容器 hdu4268

    Problem Description Alice and Bob's game never ends. Today, they introduce a new game. In this game, ...

  4. Winform 中 DesignMode 返回值不正确的问题。

    本文转载:http://blog.csdn.net/sabty/article/details/5325260 以前也曾遇到这样的问题,不过影响不大也没有去详细了解.今天又重新遇到此问题,实在太不便. ...

  5. Web App和Native App 谁将是未来

    未来是Web App的天下,还是Native App的天下?作为设计师,我们是应该努力把客户端的体验提升到最优,还是在网页应用层面上做更多的设计?这个一直是大家关心的话题.那么,我们首先应该立体的认识 ...

  6. innodb结构解析工具---innodb_ruby

    1.下载ruby并安装ruby: ftp://ftp.ruby-lang.org/pub/ruby/ ftp://ftp.ruby-lang.org/pub/ruby/ruby-2.3-stable. ...

  7. IOS-NSDateFormatter使用介绍

    IOS-NSDateFormatter使用介绍 NSDateFormatter的使用: NSDate *nowDate = [[NSDate alloc] init]; NSDateFormatter ...

  8. Java——(十)网络编程

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.Java的基本网络支持 Java为网络支持提供了java.net包,该包下的URL和URLC ...

  9. warning:This application is modifying the autolayout engine from a background thread

    警告提示:This application is modifying the autolayout engine from a background thread, which can lead to ...

  10. C#快速排序法

    最近面试的时候,被问到了快速排序法.一时之间,无法想起算法来. 重新看了书本,算法如下: 1)设置两个变量I.J,排序开始的时候:I=0,J=N-1: 2)以第一个数组元素作为关键数据,赋值给key, ...