2012-1-1 第十六章 網(wǎng)絡(luò)IPC:套接字
第一節(jié) 引言
第二節(jié) 套接字描述符
1,socket函數(shù)用于創(chuàng)建一個(gè)套接字。
2,套接字通信是雙向的。函數(shù)shutdown用于禁止套接字的輸入/輸出。
3,close函數(shù)用于關(guān)閉套接字,釋放網(wǎng)絡(luò)端點(diǎn)。
第三節(jié) 尋址
1,大端字節(jié)序:最大字節(jié)地址對(duì)應(yīng)數(shù)字的最低有效字節(jié);小端字節(jié)序則相反。
2,TCP/IP協(xié)議采用大端字節(jié)序。linux系統(tǒng)為小端字節(jié)序。
3,四個(gè)函數(shù)用于字節(jié)序的轉(zhuǎn)換:
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地址為結(jié)構(gòu)體:
struct in_addr和struct in6_addr。
5,通用地址結(jié)構(gòu)struct sockaddr定義在bits/socket.h中(linux)
6,inet_pton和inet_ntop函數(shù)用于二進(jìn)制格式和點(diǎn)分十進(jìn)制格式的轉(zhuǎn)換。
7,16.3.3小節(jié)提供了一些用于訪問網(wǎng)絡(luò)數(shù)據(jù)文件的函數(shù)。但不知什么情況下使用。
8,bind函數(shù)將地址綁定到套接字。
9,getsockname和getpeername獲得套接字中的地址。
第四節(jié) 建立連接
1,connect函數(shù)用于建立連接。
2,服務(wù)器調(diào)用listen來宣告可以接受連接請(qǐng)求。
3,accept獲得連接請(qǐng)求并建立連接。
4,注意connect和accept中套接字的阻塞狀態(tài)。
第五節(jié) 數(shù)據(jù)傳輸
1,send函數(shù)與write類似,但是可以指定標(biāo)志來改變處理傳輸數(shù)據(jù)的方式。
2,sendto函數(shù)允許在無連接的套接字上指定一個(gè)目標(biāo)地址。
3,sendmsg函數(shù)可以帶有msghdr結(jié)構(gòu)來指定多重緩沖區(qū)傳輸數(shù)據(jù),類似writev函數(shù)。
4,函數(shù)recv和read類型,但是允許指定選項(xiàng)來控制如何接收數(shù)據(jù)。
5,如果有興趣定位發(fā)送者,可以使用recvfrom來得到數(shù)據(jù)發(fā)送者的源地址。
6,為了將接收到的數(shù)據(jù)送入多個(gè)緩沖區(qū),或者想接受輔助數(shù)據(jù),可以使用recvmsg。
第六節(jié) 套接字選項(xiàng)
1,套接字機(jī)制提供兩個(gè)套接字選項(xiàng)接口來控制套接字行為。
2,兩個(gè)接口為:setsockopt和getsockopt。
第七節(jié) 帶外數(shù)據(jù)
1,帶外數(shù)據(jù)是一些通訊協(xié)議所支持的可選特征,允許更高優(yōu)先級(jí)的數(shù)據(jù)比普通數(shù)據(jù)優(yōu)先傳輸。
2,TCP將帶外數(shù)據(jù)稱為“緊急”數(shù)據(jù)。
3,TCP支持緊急標(biāo)記的概念:在普通數(shù)據(jù)流中緊急數(shù)據(jù)所在的位置。如果采用套接字選項(xiàng)SO_OOBINLINE,那么可以在普通數(shù)據(jù)中接收緊急數(shù)據(jù)。
第八節(jié) 非阻塞和異步I/O
1,套接字機(jī)制有自己的方式來處理異步I/O,但是在Single UNIX Specification中沒有標(biāo)準(zhǔn)化。
2,在基于套接字的異步I/O中,當(dāng)能夠從套接字中讀取數(shù)據(jù),或者套接字寫隊(duì)列中的空間變得可用時(shí),可以安排發(fā)送信號(hào)SIGIO。
第九節(jié) 小結(jié)
ps:幾個(gè)晚上就看完了這章,能看懂多少就可想而知了。但其實(shí)在很久前就已經(jīng)非常粗略的看過一下的,當(dāng)時(shí)要用到。非常缺乏實(shí)踐。
2012-1-5 第十七章 高級(jí)進(jìn)程間通訊
第一節(jié) 引言
第二節(jié) 基于STREAMS的管道
1,s_pipe函數(shù)創(chuàng)建基于STREAMS的全雙工管道。
2,fattach函數(shù)給STREAMS管道一個(gè)文件系統(tǒng)的名字。
3,雖然fattach函數(shù)可將任何種類的STREAMS文件描述符與文件系統(tǒng)中的一個(gè)名字相連接,但它最主要用于將一個(gè)名字給予一STREAMS管道。
4,fdetach函數(shù)撤銷STREAMS管道文件與文件系統(tǒng)中名字的關(guān)聯(lián)關(guān)系。
5,這節(jié)看不懂啊!!!!!
第三節(jié) UNIX域套接字
1,UNIX域套接字用于在同一臺(tái)機(jī)器上運(yùn)行的進(jìn)程之間的通信。雖然因特網(wǎng)域套接字可用于同一目的,但UNIX域套接字的效率更高。
2,UNIX域套接字僅僅復(fù)制數(shù)據(jù);它們并不執(zhí)行協(xié)議處理,不需要添加或刪除網(wǎng)絡(luò)報(bào)頭,無需計(jì)算檢驗(yàn)和,不要產(chǎn)生順序號(hào),無需發(fā)送確認(rèn)報(bào)文。
3,為了創(chuàng)建一對(duì)非命名的,相互連接的unix域套接字,可以使用它們面向網(wǎng)絡(luò)的域套接字接口,也可使用socketpair函數(shù)。
4,UNIX域套接字的地址用sockaddr_un結(jié)構(gòu)表示。
5,將一個(gè)地址綁定到unix域套接字時(shí),系統(tǒng)用該路徑名創(chuàng)建一類型為S_IFSOCK的文件。
第四節(jié) 傳送文件描述符
1,在進(jìn)程間傳送打開的文件描述符可以經(jīng)由STREAMS管道和UNIX域套接字實(shí)現(xiàn)。
第五節(jié) open服務(wù)器版本1
第六節(jié) open服務(wù)器版本2
第七節(jié) 小結(jié)
ps:基本上這章只看懂了UNIX域套接字一節(jié)。最后四節(jié)飛速翻過。
2012-1-8 第十八章 終端I/O
第一節(jié) 引言
1,POSIX.1在兩種不同處理風(fēng)格的基礎(chǔ)上制定了終端I/O標(biāo)準(zhǔn)。
第二節(jié) 綜述
1,終端I/O有兩種不同的工作模式:
(1)規(guī)范模式輸入處理。在這種模式中,終端輸入以行為單位進(jìn)行處理。對(duì)于每個(gè)讀要求,終端驅(qū)動(dòng)程序最多返回一行。
(2)非規(guī)范模式輸入處理。輸入字符并不組成行。
2,終端設(shè)備是由一般位于內(nèi)核中的終端驅(qū)動(dòng)程序控制的。每個(gè)終端設(shè)備有一個(gè)輸入隊(duì)列和一個(gè)輸出隊(duì)列。
3,大多數(shù)UNIX系統(tǒng)在一個(gè)稱為終端行規(guī)程的模塊中進(jìn)行規(guī)范處理。它是位于內(nèi)核通用讀,寫函數(shù)和實(shí)際設(shè)備驅(qū)動(dòng)程序之間的模塊。
4,可以檢測(cè)和更改的終端設(shè)備特性都包含在termios結(jié)構(gòu)中。該結(jié)構(gòu)定義在頭文件<termios.h>中。
5,對(duì)終端設(shè)備進(jìn)程操作的函數(shù)只有13個(gè),其中12個(gè)為POSIX.1指定,1個(gè)為XSI擴(kuò)展。
第三節(jié) 特殊輸入字符
1,POSIX.1定義了11個(gè)在輸入時(shí)作特殊處理的字符,其中9個(gè)可以更改為幾乎任意值。不能更改的兩個(gè)特殊字符是換行符和回車符。
第四節(jié) 獲得和設(shè)置終端屬性
1,使用函數(shù)tcgetattr和tcsetattr可以獲得或設(shè)置termios結(jié)構(gòu)。
第五節(jié) 終端選項(xiàng)標(biāo)志
略
第六節(jié) stty命令
1,在命令行(或shell腳本)中可以用stty命令進(jìn)行檢測(cè)和更改終端選項(xiàng)。
第七節(jié) 波特率函數(shù)
1,不明白這個(gè)波特率。
第八節(jié) 行控制函數(shù)
1,tcdrain函數(shù)等待所有輸出都被發(fā)送。
2,tcflow用于對(duì)輸入和輸出流控制進(jìn)行控制。
3,tcflush刷清(拋棄)輸入緩沖區(qū)和輸出緩沖區(qū)。
4,tcsendbreak函數(shù)在一個(gè)指定的時(shí)間區(qū)間內(nèi)發(fā)送連續(xù)的0位流。
第九節(jié) 終端標(biāo)識(shí)
1,ctermid函數(shù)被用來確定控制終端的名字。
2,在調(diào)用ctermid函數(shù)時(shí),本書說明的所有四種平臺(tái)都返回字符串/dev/tty。
3,isatty函數(shù)在引用一個(gè)終端設(shè)備時(shí)返回真。
4,ttyname返回在該文件描述符上打開的終端設(shè)備的名字。
第十節(jié) 規(guī)范模式
1,規(guī)范模式:發(fā)一個(gè)讀請(qǐng)求,輸入完一行后,終端驅(qū)動(dòng)程序即返回。
2,下列幾個(gè)條件都會(huì)造成讀返回:
(1)所要求的字節(jié)數(shù)已讀到時(shí),讀返回。
(2)當(dāng)讀到一個(gè)行定界符時(shí),讀返回。
(3)如果捕捉到一個(gè)信號(hào)并且該函數(shù)不會(huì)自動(dòng)重啟,則讀返回。
第十一節(jié) 非規(guī)范模式
1,關(guān)閉termios結(jié)構(gòu)中c_lflag字段的ICANON標(biāo)志就使終端處于非規(guī)范模式。
2,輸入讀取方式為:當(dāng)讀了指定量的數(shù)據(jù)后,或者已經(jīng)過了給定的時(shí)間后,即通知系統(tǒng)返回。這種技術(shù)使用了termios結(jié)構(gòu)中c_cc數(shù)組的兩個(gè)變量:MIN和TIME。
第十二節(jié) 終端的窗口大小
1,內(nèi)核為每個(gè)終端和偽終端保存一個(gè)winsize結(jié)構(gòu)。
2,用ioctl的TIOCGWINSZ命令可以取此結(jié)構(gòu)的當(dāng)前值。
3,用ioctl的TIOCSWINSZ命令可以講此結(jié)構(gòu)的新值放到內(nèi)核中,如果新值與當(dāng)前值不同,則向前臺(tái)進(jìn)程組發(fā)送SIGWINCH信號(hào)(默認(rèn)為忽略)。
4,提供這種功能的目的是,當(dāng)窗口大小發(fā)生變化時(shí)通知應(yīng)用程序(如VI)。應(yīng)用程序接到此信號(hào)后,可取窗口大小的新值,然后重繪屏幕。
第十三節(jié) termcap,terminfo和curses
1,termcap的意思是終端能力,它指的是文本文件/etc/termcap和一套讀此文件的例程。這種技術(shù)是在伯克利發(fā)展起來的,主要是為了支持vi編輯器。termcap文件包含了對(duì)各種終端的說明。
2,termcap這種技術(shù)不是很完善,其缺陷導(dǎo)致開發(fā)另一種新版本:terminfo和其相關(guān)的curses庫。
3,不論是termcap還是terminfo,它們所提供只是在各種終端上執(zhí)行一般性操作的方法。
4,curses是為字符終端設(shè)計(jì)的,而現(xiàn)在字符終端大部分已被以像素為基礎(chǔ)的圖形終端所替代。
第十四節(jié) 小結(jié)
ps:連文中提到的文件是否存在這么簡(jiǎn)單的事都懶得去驗(yàn)證了。還是那句,先看個(gè)概念吧。
2012-1-12 第十九章 偽終端
第一節(jié) 引言
第二節(jié) 概述
1,偽終端的某些典型應(yīng)用:
(1)網(wǎng)絡(luò)登錄服務(wù)器
(2)script程序
(3)expect程序
(4)運(yùn)行協(xié)同進(jìn)程
(5)觀看長(zhǎng)時(shí)間運(yùn)行程序的輸出
第三節(jié) 打開偽終端設(shè)備
1,posix_openpt用來打開下一個(gè)可用的偽終端主設(shè)備。
2,在偽終端從設(shè)備可用之前,使用grantpt函數(shù)設(shè)置它的權(quán)限。
3,unlockpt函數(shù)用于準(zhǔn)予對(duì)偽終端從設(shè)備的訪問,從而允許應(yīng)用程序打開該設(shè)備。
4,在grantpt哈unlockpt這兩個(gè)函數(shù)中,文件描述符參數(shù)是與主偽終端設(shè)備關(guān)聯(lián)的文件描述符。
5,ptsname函數(shù)用于在給定主偽終端設(shè)備的文件描述符時(shí),找到從偽終端設(shè)備的路徑名。
6,ptym_open打開下一個(gè)可用的PTY設(shè)備,ptys_open打開相應(yīng)的從設(shè)備。但通常不直接調(diào)用這兩個(gè)函數(shù),而由pty_fork調(diào)用。
ps:這一章看不下去了。
2012-1-11 第二十章 數(shù)據(jù)庫函數(shù)庫
第一節(jié) 引言
第二節(jié) 歷史
1,dbm(3)是在unix系統(tǒng)中很流行的數(shù)據(jù)庫函數(shù)庫,它由Ken Thompson開發(fā),使用了動(dòng)態(tài)散列結(jié)構(gòu)。
2,BSD的開發(fā)者擴(kuò)充了dbm函數(shù)庫,并將它稱為ndbm。ndbm函數(shù)被標(biāo)準(zhǔn)化后成為Single UNIX Specification的XSI擴(kuò)展部分。
3,dbm函數(shù)的GNU版本是gdbm。
4,以上函數(shù)庫的實(shí)現(xiàn)都有一個(gè)根本的缺點(diǎn)是:都不支持多個(gè)進(jìn)程對(duì)數(shù)據(jù)庫的并發(fā)更新,都沒有提供并發(fā)控制。
5,4.4BSD提供了一個(gè)新的庫db(3),支持面向記錄,散列和B-樹三種訪問模式。但是也沒有提供并發(fā)控制。
6,在linux上,gdbm即支持dbm函數(shù)庫,又支持ndbm函數(shù)庫。
第三節(jié)-第十節(jié)
略
2012-1-12 第二十一章 與網(wǎng)絡(luò)打印機(jī)通訊
第一節(jié) 引言
第二節(jié) 網(wǎng)絡(luò)打印協(xié)議
1,網(wǎng)絡(luò)打印協(xié)議IPP建立在超文本傳輸協(xié)議(HTTP)之上。
2,所有的UNIX系統(tǒng)至少提供一個(gè)打印假脫系統(tǒng),在linux和mac os x上為CUPS——Common UNIX Printing System。
3,打印配置文件是/etc/printer.conf。該文件表示了運(yùn)行打印假脫機(jī)守護(hù)進(jìn)程的服務(wù)器主機(jī)名字和網(wǎng)絡(luò)打印機(jī)的主機(jī)名字。
第三節(jié)-第六節(jié)
略
ps:全書算是瀏覽了一遍吧。STREAMS相關(guān)內(nèi)容和偽終端真是沒看懂。從十一月份斷電以來到現(xiàn)在這個(gè)學(xué)期的最后一天,每個(gè)晚上翻幾頁,總算將書翻完了。2012-1-13。