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。