Onway

我是一只菜菜菜菜鸟...
posts - 61, comments - 56, trackbacks - 0, articles - 34

APUE第十六章到第二十一章 笔记

Posted on 2012-01-13 09:44 Onway 阅读(421) 评论(0)  编辑 收藏 引用 所属分类: 使用说明
2012-1-1 第十六章 网络IPC:套接字
第一节 引言

第二节 套接字描述符
1,socket函数用于创建一个套接字。
2,套接字通信是双向的。函数shutdown用于禁止套接字的输入/输出。
3,close函数用于关闭套接字,释放网络端点。

第三节 寻址
1,大端字节序:最大字节地址对应数字的最低有效字节;小端字节序则相反。
2,TCP/IP协议采用大端字节序。linux系统为小端字节序。
3,四个函数用于字节序的转换:
htonl,htons,ntohl,ntohs
h代表host,n代表network,l代表long,s代表short。
4,套接字地址:(在netinet/in.h中定义)
a,ipv4:struct sockaddr_in
b,ipv6: struct sockaddr_in6
其中IP地址为结构体:
struct in_addr和struct in6_addr。
5,通用地址结构struct sockaddr定义在bits/socket.h中(linux)
6,inet_pton和inet_ntop函数用于二进制格式和点分十进制格式的转换。
7,16.3.3小节提供了一些用于访问网络数据文件的函数。但不知什么情况下使用。
8,bind函数将地址绑定到套接字。
9,getsockname和getpeername获得套接字中的地址。

第四节 建立连接
1,connect函数用于建立连接。
2,服务器调用listen来宣告可以接受连接请求。
3,accept获得连接请求并建立连接。
4,注意connect和accept中套接字的阻塞状态。

第五节 数据传输
1,send函数与write类似,但是可以指定标志来改变处理传输数据的方式。
2,sendto函数允许在无连接的套接字上指定一个目标地址。
3,sendmsg函数可以带有msghdr结构来指定多重缓冲区传输数据,类似writev函数。
4,函数recv和read类型,但是允许指定选项来控制如何接收数据。
5,如果有兴趣定位发送者,可以使用recvfrom来得到数据发送者的源地址。
6,为了将接收到的数据送入多个缓冲区,或者想接受辅助数据,可以使用recvmsg。

第六节 套接字选项
1,套接字机制提供两个套接字选项接口来控制套接字行为。
2,两个接口为:setsockopt和getsockopt。

第七节 带外数据
1,带外数据是一些通讯协议所支持的可选特征,允许更高优先级的数据比普通数据优先传输。
2,TCP将带外数据称为“紧急”数据。
3,TCP支持紧急标记的概念:在普通数据流中紧急数据所在的位置。如果采用套接字选项SO_OOBINLINE,那么可以在普通数据中接收紧急数据。

第八节 非阻塞和异步I/O
1,套接字机制有自己的方式来处理异步I/O,但是在Single UNIX Specification中没有标准化。
2,在基于套接字的异步I/O中,当能够从套接字中读取数据,或者套接字写队列中的空间变得可用时,可以安排发送信号SIGIO。

第九节 小结

ps:几个晚上就看完了这章,能看懂多少就可想而知了。但其实在很久前就已经非常粗略的看过一下的,当时要用到。非常缺乏实践。

2012-1-5 第十七章 高级进程间通讯
第一节 引言

第二节 基于STREAMS的管道
1,s_pipe函数创建基于STREAMS的全双工管道。
2,fattach函数给STREAMS管道一个文件系统的名字。
3,虽然fattach函数可将任何种类的STREAMS文件描述符与文件系统中的一个名字相连接,但它最主要用于将一个名字给予一STREAMS管道。
4,fdetach函数撤销STREAMS管道文件与文件系统中名字的关联关系。
5,这节看不懂啊!!!!!

第三节 UNIX域套接字
1,UNIX域套接字用于在同一台机器上运行的进程之间的通信。虽然因特网域套接字可用于同一目的,但UNIX域套接字的效率更高。
2,UNIX域套接字仅仅复制数据;它们并不执行协议处理,不需要添加或删除网络报头,无需计算检验和,不要产生顺序号,无需发送确认报文。
3,为了创建一对非命名的,相互连接的unix域套接字,可以使用它们面向网络的域套接字接口,也可使用socketpair函数。
4,UNIX域套接字的地址用sockaddr_un结构表示。
5,将一个地址绑定到unix域套接字时,系统用该路径名创建一类型为S_IFSOCK的文件。

第四节 传送文件描述符
1,在进程间传送打开的文件描述符可以经由STREAMS管道和UNIX域套接字实现。

第五节 open服务器版本1

第六节 open服务器版本2

第七节 小结

ps:基本上这章只看懂了UNIX域套接字一节。最后四节飞速翻过。

2012-1-8 第十八章 终端I/O
第一节 引言
1,POSIX.1在两种不同处理风格的基础上制定了终端I/O标准。

第二节 综述
1,终端I/O有两种不同的工作模式:
(1)规范模式输入处理。在这种模式中,终端输入以行为单位进行处理。对于每个读要求,终端驱动程序最多返回一行。
(2)非规范模式输入处理。输入字符并不组成行。
2,终端设备是由一般位于内核中的终端驱动程序控制的。每个终端设备有一个输入队列和一个输出队列。
3,大多数UNIX系统在一个称为终端行规程的模块中进行规范处理。它是位于内核通用读,写函数和实际设备驱动程序之间的模块。
4,可以检测和更改的终端设备特性都包含在termios结构中。该结构定义在头文件<termios.h>中。
5,对终端设备进程操作的函数只有13个,其中12个为POSIX.1指定,1个为XSI扩展。

第三节 特殊输入字符
1,POSIX.1定义了11个在输入时作特殊处理的字符,其中9个可以更改为几乎任意值。不能更改的两个特殊字符是换行符和回车符。

第四节 获得和设置终端属性
1,使用函数tcgetattr和tcsetattr可以获得或设置termios结构。

第五节 终端选项标志

第六节 stty命令
1,在命令行(或shell脚本)中可以用stty命令进行检测和更改终端选项。

第七节 波特率函数
1,不明白这个波特率。

第八节 行控制函数
1,tcdrain函数等待所有输出都被发送。
2,tcflow用于对输入和输出流控制进行控制。
3,tcflush刷清(抛弃)输入缓冲区和输出缓冲区。
4,tcsendbreak函数在一个指定的时间区间内发送连续的0位流。

第九节 终端标识
1,ctermid函数被用来确定控制终端的名字。
2,在调用ctermid函数时,本书说明的所有四种平台都返回字符串/dev/tty。
3,isatty函数在引用一个终端设备时返回真。
4,ttyname返回在该文件描述符上打开的终端设备的名字。

第十节 规范模式
1,规范模式:发一个读请求,输入完一行后,终端驱动程序即返回。
2,下列几个条件都会造成读返回:
(1)所要求的字节数已读到时,读返回。
(2)当读到一个行定界符时,读返回。
(3)如果捕捉到一个信号并且该函数不会自动重启,则读返回。

第十一节 非规范模式
1,关闭termios结构中c_lflag字段的ICANON标志就使终端处于非规范模式。
2,输入读取方式为:当读了指定量的数据后,或者已经过了给定的时间后,即通知系统返回。这种技术使用了termios结构中c_cc数组的两个变量:MIN和TIME。

第十二节 终端的窗口大小
1,内核为每个终端和伪终端保存一个winsize结构。
2,用ioctl的TIOCGWINSZ命令可以取此结构的当前值。
3,用ioctl的TIOCSWINSZ命令可以讲此结构的新值放到内核中,如果新值与当前值不同,则向前台进程组发送SIGWINCH信号(默认为忽略)。
4,提供这种功能的目的是,当窗口大小发生变化时通知应用程序(如VI)。应用程序接到此信号后,可取窗口大小的新值,然后重绘屏幕。

第十三节 termcap,terminfo和curses
1,termcap的意思是终端能力,它指的是文本文件/etc/termcap和一套读此文件的例程。这种技术是在伯克利发展起来的,主要是为了支持vi编辑器。termcap文件包含了对各种终端的说明。
2,termcap这种技术不是很完善,其缺陷导致开发另一种新版本:terminfo和其相关的curses库。
3,不论是termcap还是terminfo,它们所提供只是在各种终端上执行一般性操作的方法。
4,curses是为字符终端设计的,而现在字符终端大部分已被以像素为基础的图形终端所替代。

第十四节 小结

ps:连文中提到的文件是否存在这么简单的事都懒得去验证了。还是那句,先看个概念吧。

2012-1-12 第十九章 伪终端
第一节 引言

第二节 概述
1,伪终端的某些典型应用:
(1)网络登录服务器
(2)script程序
(3)expect程序
(4)运行协同进程
(5)观看长时间运行程序的输出

第三节 打开伪终端设备
1,posix_openpt用来打开下一个可用的伪终端主设备。
2,在伪终端从设备可用之前,使用grantpt函数设置它的权限。
3,unlockpt函数用于准予对伪终端从设备的访问,从而允许应用程序打开该设备。
4,在grantpt哈unlockpt这两个函数中,文件描述符参数是与主伪终端设备关联的文件描述符。
5,ptsname函数用于在给定主伪终端设备的文件描述符时,找到从伪终端设备的路径名。
6,ptym_open打开下一个可用的PTY设备,ptys_open打开相应的从设备。但通常不直接调用这两个函数,而由pty_fork调用。

ps:这一章看不下去了。

2012-1-11 第二十章 数据库函数库
第一节 引言

第二节 历史
1,dbm(3)是在unix系统中很流行的数据库函数库,它由Ken Thompson开发,使用了动态散列结构。
2,BSD的开发者扩充了dbm函数库,并将它称为ndbm。ndbm函数被标准化后成为Single UNIX Specification的XSI扩展部分。
3,dbm函数的GNU版本是gdbm。
4,以上函数库的实现都有一个根本的缺点是:都不支持多个进程对数据库的并发更新,都没有提供并发控制。
5,4.4BSD提供了一个新的库db(3),支持面向记录,散列和B-树三种访问模式。但是也没有提供并发控制。
6,在linux上,gdbm即支持dbm函数库,又支持ndbm函数库。

第三节-第十节

2012-1-12  第二十一章 与网络打印机通讯
第一节 引言

第二节 网络打印协议
1,网络打印协议IPP建立在超文本传输协议(HTTP)之上。
2,所有的UNIX系统至少提供一个打印假脱系统,在linux和mac os x上为CUPS——Common UNIX Printing System。
3,打印配置文件是/etc/printer.conf。该文件表示了运行打印假脱机守护进程的服务器主机名字和网络打印机的主机名字。

第三节-第六节

ps:全书算是浏览了一遍吧。STREAMS相关内容和伪终端真是没看懂。从十一月份断电以来到现在这个学期的最后一天,每个晚上翻几页,总算将书翻完了。2012-1-13。

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理