读《Linux C编程一站式学习》II

读《LC编程一站式编程--宋劲杉II。此NoteLC编程一站式学习》I的“文件系统”、“信号”、“TCP/IP”及“Socket编程”章节。不含进程章节的“实现简单的Shell”及线程章节的”哲学家问题“题目实现。剪辑部分大都来自书本,作为摘录型笔记。练习部分是Debian/GNU/Linux(在一个笔记本电脑中安装了Debian Linux系统)下的编程练习或验证,作为练习笔记。


1练习||总结

x86/Debian GNU Linux/gcc

PART II

(1)C源程序的编译 链接main()的调用

 

PART III

(2)基于TCP/IP的简单的聊天程序

(3)IPC of UNIX Domain Socket基础程序实现

(4)简单的Web服务器实现(server--servercode, browser--client)


2剪辑

1VFS

Linux内核在各种不同的文件系统格式之上做了一个抽象层,使得文件、目录、读写访问等概念成为抽象层的概念,因此各种文件系统看起来用起来都一样,这个抽象层称为虚拟文件系统(VFS,Virtual Filesystem)

Directories' and files' information are saved on disks. VFS read their information into inode,super_block,dentry structures. In every process, there is a file description table, each one file description point to one files tructure when someone file was opened by such as open function.System call functions are the pointers point to one special kernel code. System functions find the files tructure in kernel by file description which is passed by programmer.


(2)信号

每个信号都有一个编号和一个宏定义名称,这些宏定义可以在signal.h中找到 。信号应用进程控制中,记在接收该信号进程的PCB中。


产生信号的条件主要有:

  • 通过终端按键产生信号(Ctrl+ C, Ctrl + Z

  • 调用系统函数向进程发信号(kill(),raisse())

  • 由软件条件产生信号(alarm())

  • 硬件异常产生信号


信号在内核中的表示示意图

每个信号都有两个标志位分别表示阻塞和未决,还有一个函数指针表示处理动作。信号产生时,内核在进程控制块中设置该信号的未决标志,直到信号递达才清除该标志。如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号。当捕捉到信号时,不论进程的主控制流程当前执行到哪儿,都会先跳到信号处理函数中执行,从信号处理函数返回后再继续执行主控制流程。


3Core Dump

当一个进程要异常终止时,可以选择把进程的用户空间内存数据全部保存到磁盘上,文件名通常是core,这叫做Core Dump


(4)信号递达(Delivery)信号未决(Pending)'

执行信号的处理动作称为信号递达(Delivery),信号从产生到递达之间的状态,称为信号未决(Pending)。进程可以选择阻塞(Block)某个信号。被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作。


(5)可重入(Reentrant)函数

函数被不同的控制流程调用,有可能在第一次调用还没返回时就再次进入该函数,这称为重入。果一个函数只访问自己的局部变量或参数,则称为可重入(Reentrant)函数。


(6)终端

UNIX系统中,用户通过终端登录系统后得到一个Shell进程,这个终端成为Shell进程的控制终端(Controlling Terminal),控制终端(keyboard and显示器)是保存在PCB中的信息(such as putty, ISP etc. are terminal tool)


每个进程都可以通过一个特殊的设备文件/dev/tty访问它的控制终端。事实上每个终端设备都对应一个不同的设备文件,/dev/tty提供了一个通用的接口,一个进程要访问它的控制终端既可以通过/dev/tty也可以通过该终端设备所对应的设备文件来访问。ttyname函数可以由文件描述符查出对应的文件名,该文件描述符必须指向一个终端设备而不能是任意文件。


(7)作业控制(Job Control)

一个前台作业可以由多个进程组成,一个后台作业也可以由多个进程组成,Shell可以同时运行一个前台作业和任意多个后台作业,这称为作业控制(Job Control)


(8)Session与进程组

(9)守护进程(Daemon)

Linux系统启动时会启动很多系统服务进程,这些系统服务进程没有控制终端,不能直接和用户交互。其它进程都是在用户登录或运行程序时创建,在运行结束或用户注销时终止,但系统服务进程不受用户登录注销的影响,它们一直在运行着。这种进程有一个名称叫守护进程(Daemon)


(10)协议

协议由三要素组成:

[1]语法,即数据控制信息的结构或格式;

[2]语义,即需要发出何种控制信息,完成何种动作以及做出何种响应;

[3]时序(同步),即事件实现顺序的详细说明。

协议总是指某一层的协议。准确地说,它是在同等层之间的实体通信时,有关通信规则和约定的集合就是该层协议。


(11)TCP/IP协议栈与数据包封装

TCP/IP网络协议栈分为应用层(Application)、传输层(Transport)、网络层(Network)和链路层(Link)四层,链路层之下还有物理层,指的是电信号的传递方式,比如现在以太网通用的网线(双绞线)。 传输层及其以下的机制由内核提供,应用层由用户进程提供。每层协议 都要加上一个数据首(header),称为封装(Encapsulation)。不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报(datagram),在链路层叫做帧(frame)


(12)层和工作在某层的设备

are code or physical object, the code has its special functions.工作在某层的设备's code service for 某层'sinformation which is processed by某层's code.


(13)网 段

Internet被各种路由器和网关设备分隔成很多网段,为了标识不同的网段,需要把32位的IP地址划分成网络号和主机号两部分,网络号相同的各主机位于同一网段,相互间可以直接通信,网络号不同的主机之间通信则需要通过路由器转发。


(14)学习socket API

在学习socketAPI时要注意应用程序和TCP协议层是如何交互的:*应用程序调用某个socket函数时TCP协议层完成什么动作,比如调用connect()会发出SYN*应用程序如何知道TCP协议层的状态变化,比如从某个阻塞的socket函数返回就表明TCP协议收到了某些段,再比如read()返回0就表明收到了FIN段。


(15)进程的地址空间

环境变量字符串都是name=value这样的形式,大多数name由大写字母加下划线组成,一般把name的部分叫做环境变量,value的部分则是环境变量的值。


[2014.09.20 -- 17:31]

R《LC》Note Over.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
网上很多地方可以找到本书的下载,我唯一能够额外贡献的是,提供多格式的打包下载,包括:PDF格式,离线网页格式,在线网页格式。 如果您觉得下载比较麻烦,那么建议您直接使用在线教程,网址是:http://learn.akae.cn/media/index.html 如果您只需要一个可以打印的PDF格式文件,那么建议你下载Defonds的资源,因为我的PDF格式文件就是从他那下的,资源链接是:http://download.csdn.net/detail/defonds/2855361 如果您和我一样,希望在多种环境下都可以方便地使用本书,那么欢迎您下载我提供的这个打包资源! 对本书的描述 版权 © 2008, 2009 宋劲杉, 北京亚嵌教育研究中心 这本书最初是为北京亚嵌教育研究中心的嵌入式Linux系统工程师就业班课程量身定做的教材之一,作者宋劲松。 这是一本从零基础开始学习编程的书,不要求者有任何编程经验,但者应勤于思考。本书尽最大努力理清概念之间的依赖关系,力求一站式学习者不需要为了找一个概念的定义去翻其它书,也不需要为了搞清楚一个概念在本书中前后一通乱翻,只需从前到后按顺序学习即可。但一站式学习并不等于傻瓜式学习,有些章节有一定的难度,需要积极思考才能领会。本书可以替你节省时间,但不能替你思考,不要指望像看小说一样走马观花看一遍就能学会。 本书不是孤立地讲C语言,而是和编译原理、操作系统、计算机体系结构结合起来讲。或者说,本书的内容只是以C语言为载体,真正讲的是计算机的原理和程序的原理。 强调基本概念和基本原理,在编排顺序上非常重视概念之间的依赖关系,每次引入一个新的概念,只依赖于前面章节已经讲过的概念,而绝不会依赖后面章节要讲的概念。有些地方为了叙述得完整,也会引用后面要讲的内容,比如说“有关XX我们到XX章再仔细讲解”,凡是这种引用都不是必要的依赖,可以当它不存在,只管继续往下看就行了。 这本书定位在入门级,虽然内容很多,但不是一本百科全书,除了C语言基本要讲透之外其它内容都不深入,书中列出了很多参考资料,是者进一步学习的起点。K&R的第一章是一个Whirlwind Tour,把全书的内容简单过了一遍,然后再逐个深入进去讲解。本书也可以看作是计算机专业课程体系的一个Whirlwind Tour,学习完本书之后有了一个全局观,再去学习那些参考资料就应该很容易上手了。 本书的主要内容包括三大部分: C语言入门。介绍基本的C语法,帮助没有任何编程经验的者理解什么是程序,怎么写程序,培养程序员的思维习惯,找到编程的感觉。前半部分改编自《How To Think Like A Computer Scientist: Learning with C++》(Allen B. Downey.) C语言本质。结合计算机和操作系统的原理讲解C程序是怎么编译、链接、运行的,同时全面介绍C的语法。位运算的章节改编自亚嵌教育林小竹老师的讲义,链表和二叉树的章节改编自亚嵌教育朱老师的讲义。汇编语言的章节改编自《Programming from the Ground Up: An Introduction to Programming using Linux Assembly Language》(Jonathan Bartlett.)在该书的最后一章提到,学习编程有两种Approach,一种是Bottom Up,一种是Top Down,各有优缺点,需要两者结合起来。所以作者编这本书的思路是,第一部分Top Down,第二部分Bottom Up,第三部分可以算填了中间的空隙,三部分全都围绕C语言展开。 Linux系统编程。介绍各种Linux系统函数和内核的工作原理。Socket编程的章节改编自亚嵌教育卫剑钒老师的讲义。 为什么要在Linux平台上学C语言?用Windows学C语言不好吗? 用Windows还真的是学不好C语言。C语言是一种面向底层的编程语言,要写好C程序,必须对操作系统的工作原理非常清楚,因为操作系统也是用C写的,我们用C写应用程序直接使用操作系统提供的接口。既然你选择了看这本书,你一定了解:Linux是一种开源的操作系统,你有任何疑问都可以从源代码和文档中找到答案,即使你看不懂源代码,也找不到文档,也很容易找个高手教你,各种邮件列表、新闻组和论坛上从来都不缺乐于助人的高手;而Windows是一种封闭的操作系统,除了微软的员工别人都看不到它的源代码,只能通过文档去猜测它的工作原理,更糟糕的是,微软向来喜欢藏着揶着,好用的功能留着自己用,而不会写到文档里公开。本书的第一部分在Linux或Windows平台上学习都可以,但第二部分和第三部分介绍了很多Linux操作系统的原理以帮助者更深入地理解C语言,只能在Linux平台上学习。 Windows平台上的开发工具往往和各种集成开发环境(IDE,Integrated Development Environment)绑在一起,例如Visual Studio、Eclipse等。使用IDE确实很便捷,但IDE对于初学者绝对不是好东西。微软喜欢宣扬傻瓜式编程的理念,告诉你用鼠标拖几个控件,然后点一个按钮就可以编译出程序来,但是真正有用的程序有哪个是这么拖出来的?很多从Windows平台入门学编程的人,编了好几年程序,还是只知道编完程序点一个按钮就可以跑了,把几个源文件拖到一个项目里就可以编译到一起了,如果有更复杂的需求他们就傻眼了,因为他们脑子里只有按钮、菜单的概念,根本没有编译器、链接器、Makefile的概念,甚至连命令行都没用过,然而这些都是初学编程就应该建立起来的基本概念。另一方面,编译器、链接器和C语言的语法有密切的关系,不了解编译器、链接器的工作原理,也不可能真正掌握C的语法。所以,IDE并没有帮助你学习,而是阻碍了你学习,本来要学好C编程只要把语法和编译命令学会就行了,现在有了IDE,除了学会语法和编译命令,你还得弄清楚编译命令和IDE是怎么集成的,这才算学明白了,本来就很复杂的学习任务被IDE搞得更加复杂了。Linux用户的使用习惯从来都是以敲命令为主,以鼠标操作为辅,从学编程的第一天起就要敲命令编译程序,等到你把这些基本概念都搞清楚了,你觉得哪个IDE好用你再去用,不过到那时候你可能会更喜欢vi或emacs而不是IDE了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值