久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

《UNIX环境高级编程——APUE》

發(fā)布時(shí)間:2023/12/14 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《UNIX环境高级编程——APUE》 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

《UNIX環(huán)境高級(jí)編程——APUE》

【附】小知識(shí)

1、同步、異步

概念:消息的通知機(jī)制
解釋:涉及到IO通知機(jī)制;
同步,就是發(fā)起調(diào)用后,被調(diào)用者處理消息,必須等處理完才直接返回結(jié)果,沒處理完之前是不返回的,調(diào)用者主動(dòng)等待結(jié)果;
eg. 我去銀行辦理業(yè)務(wù), 選擇排隊(duì)等,排到頭了就辦理。

異步,就是發(fā)起調(diào)用后,被調(diào)用者直接返回,但是并沒有返回結(jié)果,等處理完消息后,通過狀態(tài)、通知或者回調(diào)函數(shù)來通知調(diào)用者,調(diào)用者被動(dòng)接收結(jié)果。

eg. 我去銀行辦理業(yè)務(wù)*,* 取一個(gè)小紙條上面有我的號(hào)碼*,* 等到排到我這一號(hào)時(shí)由柜臺(tái)的人通知我輪到我去辦理業(yè)務(wù)。

2、阻塞與非阻塞

概念:程序等待調(diào)用結(jié)果時(shí)的狀態(tài)
解釋:涉及到CPU線程調(diào)度;
阻塞:就是調(diào)用結(jié)果返回之前,該執(zhí)行線程會(huì)被掛起,不釋放 CPU 執(zhí)行權(quán),線程不能做其它事情,只能等待,只有等到調(diào)用結(jié)果返回了,才能接著往下執(zhí)行;
eg. 上面的那個(gè)例子, 不論是排隊(duì)還是使用號(hào)碼等待通知,如果在這個(gè)等待的過程中,等待者除了等待消息之外不能做其它的事情, 那么該機(jī)制就是阻塞的。
非阻塞:就是在沒有獲取調(diào)用結(jié)果時(shí),不是一直等待,線程可以往下執(zhí)行,如果是同步的,通過輪詢的方式檢查有沒有調(diào)用結(jié)果返回,如果是異步的,會(huì)通知回調(diào)。
eg. 在銀行辦理這些業(yè)務(wù)的時(shí)候一邊打打電話發(fā)發(fā)短信一邊等待,這樣的狀態(tài)就是非阻塞的。

3、基本的 進(jìn)程控制語(yǔ)言

? 用 fork 創(chuàng)建新進(jìn)程;
? 用 exec 可以初始執(zhí)行新的程序;
? exit 函數(shù) 和 wait 函數(shù)處理終止和等待終止。
exit(0) 正常退出
exit(1) 非正常退出

4、進(jìn)程組、會(huì)話、前臺(tái)進(jìn)程組、后臺(tái)進(jìn)程組、終端控制

進(jìn)程組與會(huì)話:

進(jìn)程組是一組相關(guān)進(jìn)程的集合,會(huì)話是一組相關(guān)進(jìn)程組的集合。進(jìn)程都有父進(jìn)程, 父進(jìn)程也有父進(jìn)程, 這就形成了一個(gè)以init進(jìn)程為根的家族樹。除此以外,進(jìn)程還有其他層次關(guān)系:進(jìn)程、進(jìn)程組、會(huì)話。進(jìn)程組和會(huì)話在進(jìn)程之前形成了兩級(jí)的層次:進(jìn)程組是一組相關(guān)進(jìn)程的集合,會(huì)話是一組相關(guān)進(jìn)程組的集合。

這樣說來,一個(gè)進(jìn)程會(huì)有如下ID:
? PID:進(jìn)程的唯一標(biāo)識(shí)。對(duì)于多線程的進(jìn)程而言所有線程調(diào)用getpid()函數(shù)會(huì)返回相同值。
? PGID:進(jìn)程組ID。每個(gè)進(jìn)程都會(huì)有進(jìn)程組ID,表示該進(jìn)程所屬的進(jìn)程組。默認(rèn)情況下新創(chuàng)建的進(jìn)程會(huì)繼承父進(jìn)程的進(jìn)程組ID。
? SID:會(huì)話ID。每個(gè)進(jìn)程也都有會(huì)話ID。默認(rèn)情況下,新創(chuàng)建的進(jìn)程會(huì)繼承父進(jìn)程的會(huì)話ID

會(huì)話:
由于Linux是多用戶多任務(wù)的分時(shí)系統(tǒng),所以必須要支持多個(gè)用戶同時(shí)使用一個(gè)操作系統(tǒng)。當(dāng)一個(gè)用戶登錄一次系統(tǒng)就形成一次會(huì)話。
一個(gè)會(huì)話包含多個(gè)進(jìn)程組,但是只能有一個(gè)前臺(tái)進(jìn)程組。每個(gè)會(huì)話都有一個(gè)會(huì)話首領(lǐng) (leader),即創(chuàng)建會(huì)話的進(jìn)程 sys_setsid() / setsid() 調(diào)用能創(chuàng)建一個(gè)會(huì)話。但必須注意的是,只有當(dāng)前進(jìn)程不是進(jìn)程組組長(zhǎng)時(shí),才能創(chuàng)建一個(gè)新的會(huì)話。調(diào)用 setsid 之后,該進(jìn)程成為會(huì)話的 leader 。
一個(gè)會(huì)話只能有一個(gè)控制終端。這通常是登錄到其上的終端設(shè)備(在終端登錄情況下)或者偽終端設(shè)備在網(wǎng)絡(luò)登錄情況下。建立與控制終端連接的會(huì)話被稱為控制進(jìn)程一個(gè)會(huì)話中的幾個(gè)進(jìn)程組可以分為前臺(tái)進(jìn)程組與后臺(tái)進(jìn)程組。所以一個(gè)會(huì)話中,應(yīng)該包括控制進(jìn)程(會(huì)話首進(jìn)程),一個(gè)前臺(tái)進(jìn)程組與任意多個(gè)后臺(tái)進(jìn)程組。
前臺(tái)進(jìn)程 與 后臺(tái)進(jìn)程:
用戶在 shell 中可以同時(shí)執(zhí)行多個(gè)命令。對(duì)于耗時(shí)很久的命令(如編譯大型工程),用戶不必傻傻等待命令運(yùn)行完畢才執(zhí)行下一個(gè)命令。用戶在執(zhí)行命令時(shí),可以在命令的結(jié)尾添加 “&” 符號(hào),表示將命令放入后臺(tái)執(zhí)行。這樣該命令對(duì)應(yīng)的進(jìn)程組即為后臺(tái)進(jìn)程組。
在任意時(shí)刻,可能同時(shí)存在多個(gè)后臺(tái)進(jìn)程組,但是不管什么時(shí)候都只能有一個(gè)前臺(tái)進(jìn)程組。只有在前臺(tái)進(jìn)程組中進(jìn)程才能在控制終端讀取輸入。當(dāng)用戶在終端輸入信號(hào)生成終端字符(如ctrl+c、ctrl+z、ctr+\等)時(shí),對(duì)應(yīng)的信號(hào)只會(huì)發(fā)送給前臺(tái)進(jìn)程組。
shell 中可以存在多個(gè)進(jìn)程組,無論是前臺(tái)進(jìn)程組還是后臺(tái)進(jìn)程組,它們或多或少存在一定的聯(lián)系,為了更好地控制這些進(jìn)程組(或者稱為作業(yè)),系統(tǒng)引入了會(huì)話的概念。會(huì)話的意義在于將很多的工作囊括在一個(gè)終端,選取其中一個(gè)作為前臺(tái)來直接接收終端的輸入及信號(hào),其他的工作則放在后臺(tái)執(zhí)行。
終端控制:
會(huì)話的領(lǐng)頭進(jìn)程打開一個(gè)終端后,該終端就會(huì)成為該會(huì)話的控制終端(SVR4/linux),與控制終端建立連接的會(huì)話領(lǐng)頭進(jìn)程成為控制進(jìn)程(session leader)。一個(gè)會(huì)話只能有一個(gè)控制終端,產(chǎn)生在控制終端上的輸入和信號(hào)將發(fā)送給會(huì)話的前臺(tái)進(jìn)程組中的所有進(jìn)程,終端上的連接斷開時(shí)(比如網(wǎng)絡(luò)斷開或Modem斷開),掛起信號(hào)將發(fā)送到控制進(jìn)程(session leader)。
綜上:
進(jìn)程屬于一個(gè)進(jìn)程組,進(jìn)程組屬于一個(gè)會(huì)話,會(huì)話可能有也可能沒有控制終端。一般而言,當(dāng)用戶在某個(gè)終端上登錄時(shí),一個(gè)新的會(huì)話就開始了。
進(jìn)程組由組中的領(lǐng)頭進(jìn)程標(biāo)識(shí),領(lǐng)頭進(jìn)程的進(jìn)程標(biāo)識(shí)符就是進(jìn)程組的組 標(biāo)識(shí)符。類似的,每個(gè)會(huì)話也有對(duì)應(yīng)一個(gè)領(lǐng)頭進(jìn)程。同一會(huì)話中的進(jìn)程通過該會(huì)話的領(lǐng)頭進(jìn)程和一個(gè)終端相連,該終端作為這個(gè)會(huì)話的控制終端。
一個(gè)會(huì)話只有一個(gè)控制終端,而一個(gè)控制終端只能控制一個(gè)會(huì)話。用戶通過控制終端,可以向控制終端所控制的會(huì)話中的進(jìn)程發(fā)送鍵盤信號(hào)。
同一個(gè)會(huì)話中只能有一個(gè)前臺(tái)進(jìn)程組,屬于前臺(tái)進(jìn)程組的進(jìn)程可以從控制終端獲得輸入,而其他進(jìn)程均是后臺(tái)進(jìn)程,可能分屬于不同的后臺(tái)進(jìn)程組。
當(dāng)我們打開多個(gè)終端窗口時(shí),實(shí)際上就創(chuàng)建了多個(gè)終端會(huì)話。每個(gè)會(huì)話都有自己的前臺(tái)工作和后臺(tái)工作

5、init

在計(jì)算機(jī)上啟動(dòng)Linux時(shí),內(nèi)核裝入并啟動(dòng)init程序。然后init程序裝載硬盤和啟動(dòng)終端程序。登錄終端程序時(shí),它啟動(dòng)命令行界面Shell。在計(jì)算機(jī)上啟動(dòng)Linux之后,init程序監(jiān)視任何關(guān)閉計(jì)算機(jī)的信號(hào),如不間斷電源(UPS)發(fā)生的電源故障信號(hào)和重新啟動(dòng)命令。init是Linux系統(tǒng)操作中不可缺少的程序之一。所謂的init進(jìn)程,它是一個(gè)由內(nèi)核啟動(dòng)的用戶級(jí)進(jìn)程。內(nèi)核自行啟動(dòng)(已經(jīng)被載入內(nèi)存,開始運(yùn)行,并已初始化所有的設(shè)備驅(qū)動(dòng)程序和數(shù)據(jù)結(jié)構(gòu)等)之后,就通過啟動(dòng)一個(gè)用戶級(jí)程序init的方式,完成引導(dǎo)進(jìn)程。所以,init始終是第一個(gè)進(jìn)程(其進(jìn)程編號(hào)始終為1)。 內(nèi)核會(huì)在過去曾使用過init的幾個(gè)地方查找它,它的正確位置(對(duì)Linux系統(tǒng)來說)是/sbin/init。如果內(nèi)核找不到init,它就會(huì)試著運(yùn)行/bin/sh,如果運(yùn)行失敗,系統(tǒng)的啟動(dòng)也會(huì)失敗。

6、Unix/Linux 的 System V、BSD、Posix概念

  • System V和BSD
    ??Unix操作系統(tǒng)在操作風(fēng)格上主要分為System V和BSD(目前一般采用BSD的第4個(gè)版本SVR4),前者的代表的操作系統(tǒng)有Solaris操作系統(tǒng),在Solaris1.X之前,Solaris采用的是BSD風(fēng)格,2.x之后才投奔System V陣營(yíng)。后者的代表的操作系統(tǒng)有FreeBSD。
    ??System V它最初由AT&T開發(fā),曾經(jīng)也被稱為AT&T System V,是Unix操作系統(tǒng)眾多版本中的一支。在1983年第一次發(fā)布,一共發(fā)行了4個(gè)System V的主要版本,System V Release4,或者稱為SVR4,是最成功的版本,該版本有些風(fēng)格成為一些UNIX共同特性的源頭,如下表格的初始化腳本/etc/init.d。用來控制系統(tǒng)的啟動(dòng)和關(guān)閉。
    ??BSD(Berkeley Software Distribution,伯克利軟件套件)是Unix的衍生系統(tǒng),1970年代由伯克利加州大學(xué)(Uni Versity of California, Berkeley)開創(chuàng)。BSD用來代表由此派生出的各種套件集合。

  • Poxis和System V
    ??System V的概念如上所述。Posix是Portable Operating System Interface(可移植性操作系統(tǒng)接口)的簡(jiǎn)稱,是一個(gè)電氣與電子工程學(xué)會(huì)即IEEE開發(fā)的一系列標(biāo)準(zhǔn),目的是為運(yùn)行在不同操作系統(tǒng)的應(yīng)用程序提供統(tǒng)一的接口,實(shí)現(xiàn)者是不同的操作系統(tǒng)內(nèi)核。
    ??將這兩個(gè)名詞放在一起討論的一般是在Linux的進(jìn)程間通信中,如在信號(hào)量編程中,有Posix信號(hào)量和System V信號(hào)量。它們都可以用于進(jìn)程或者線程間的同步。然而, Posix信號(hào)量是基于內(nèi)存的,即信號(hào)量值是放在共享內(nèi)存中的,它使與文件系統(tǒng)中的路徑名對(duì)應(yīng)的名字來標(biāo)識(shí)。當(dāng)我們談?wù)摗癙osix 信號(hào)量”時(shí),所指的是單個(gè)計(jì)數(shù)信號(hào)量。在Linux操作系統(tǒng)中,Posix信號(hào)量(共享內(nèi)存、消息隊(duì)列)可以通過ipcs命令查看。Posix信號(hào)量多用于進(jìn)程間通信。
    ??System v信號(hào)量測(cè)試基于內(nèi)核的,它放在內(nèi)核里面,要使用System V信號(hào)量需要進(jìn)入內(nèi)核態(tài),所以在多線程編程中一般不建議使用System V信號(hào)量,因?yàn)榫€程相對(duì)于進(jìn)程是輕量級(jí)的,從操作系統(tǒng)的調(diào)度開銷角度看,如果使用System V信號(hào)量會(huì)使得每次調(diào)用都要進(jìn)入內(nèi)核態(tài),喪失了線程的輕量?jī)?yōu)勢(shì)。當(dāng)我們討論“System v信號(hào)量”時(shí),所指的是計(jì)數(shù)信號(hào)量集。

  • 第1章-UNIX基礎(chǔ)知識(shí)

    1、UNIX 和Linux的區(qū)別:

    ? UNIX 誕生于 20 世紀(jì) 60 年代末,
    Windows 誕生于 20 世紀(jì) 80 年代中期,
    Linux 誕生于 20 世紀(jì) 90 年代初
    (后來的 Windows 和 Linux 都參考了 UNIX)
    ? UNIX大多與硬件配套(UNIX操作系統(tǒng)),Linux 可運(yùn)行在多種硬件平臺(tái)上。
    ? UNIX收費(fèi)(貝爾實(shí)驗(yàn)室),Linux 免費(fèi)開源

    2、什么是Linux 系統(tǒng)

    Linux系統(tǒng)主要由以下4部分構(gòu)成:

  • Linux內(nèi)核
    內(nèi)核主要負(fù)責(zé)以下四種功能:

  • 系統(tǒng)內(nèi)存管理
    內(nèi)核不斷地在交換空間(swap space)和實(shí)際物理內(nèi)存之間交換虛擬內(nèi)存中的內(nèi)容。
    2.軟件程序管理(進(jìn)程管理)
    3.硬件設(shè)備管理
    通過驅(qū)動(dòng)程序?qū)崿F(xiàn)硬件設(shè)備與應(yīng)用程序之間的通信。在Linux系統(tǒng)中加入驅(qū)動(dòng)程序代碼的方式有以下兩種: 1.編譯進(jìn)內(nèi)核的設(shè)備驅(qū)動(dòng)代碼
    2.可插入內(nèi)核的設(shè)備驅(qū)動(dòng)代碼
    4.文件系統(tǒng)管理
    ext,ext2,ext3,ext4,minix,nfs,ntfs,XFS等。

  • GNU工具
    GNU(GNU is not Unix的縮寫),是一套為Unix系統(tǒng)管理員設(shè)計(jì)的一套類似于Unix的環(huán)境。
    Linux 系統(tǒng)和 GNU 工具的結(jié)合體稱為 Linux系統(tǒng),也叫做 GNU/Linux系統(tǒng)。 核心 GNU 工具(coreutils)包括以下三部分:
    1.用以處理文件的工具
    2.用于處理文本的工具
    3.用于管理進(jìn)程的工具
    還包括 shell,例如 bash shell。

  • 圖形化桌面環(huán)境
    X Window軟件包:直接和 PC 上的顯卡和顯示器打交道的底層程序,可以產(chǎn)生圖形化顯示環(huán)境。 其中最流行的軟件包時(shí) x.org。 桌面環(huán)境:KDE、GNOME、Unity(Ubuntu特有)等

  • 應(yīng)用程序

  • 3、進(jìn)程控制

    進(jìn)程
    進(jìn)程:程序的執(zhí)行實(shí)例被稱為進(jìn)程(process)。
    進(jìn)程ID: UNIX系統(tǒng)確保每個(gè)進(jìn)程都有一個(gè)唯一的數(shù)字標(biāo)識(shí)符(是一個(gè)非負(fù)整數(shù))。
    進(jìn)程控制:有 3 個(gè)用于進(jìn)程控制的主要函數(shù): folk 、exec 和 waitpid。
    線程
    線程:某一時(shí)刻執(zhí)行的一組機(jī)器指令。
    線程ID:線程也有自己的ID標(biāo)識(shí)符,只在它所屬的進(jìn)程內(nèi)起作用。一個(gè)線程中的線程ID在另一個(gè)進(jìn)程中沒有意義。
    信號(hào)
    信號(hào)(signal): 用于通知進(jìn)程發(fā)生了某種情況。

    第 2 章- UNIX 標(biāo)準(zhǔn)及實(shí)現(xiàn)

    沒講啥

    第 3 章-文件 I/O

    1、引言

    文件 I/O函數(shù)主要包括:打開文件、讀文件、寫文件 操作。用到的函數(shù)有:open、 read、 write、 lseed、 close。

    2、文件描述符

    1) UNIX系統(tǒng)shell把
    文件描述符 0 與進(jìn)程的標(biāo)準(zhǔn)輸入關(guān)聯(lián);
    文件描述符 1 與標(biāo)準(zhǔn)輸出關(guān)聯(lián);
    文件描述符 2 與標(biāo)準(zhǔn)錯(cuò)誤關(guān)聯(lián);
    一個(gè)套接字端點(diǎn)表示為一個(gè)文件描述符(16.5)。

    3、函數(shù) open 和 openat

    在 <fcnt1.h>中定義了幾個(gè)常用的常量,表示對(duì)文件的操作:
    O_RDONLY 只讀打開, 一般定義為 0
    O_WRONLY 只寫打開, 一般定義為 1
    O_RDWR 讀、寫打開, 一般定義為2

    4、函數(shù) creat

    #include <fcnt1.h>
    int creat(const char *path, mode_t mode);
    //返回值:成功,返回為只寫打開的文件描述符。出錯(cuò),返回-1
    //path 創(chuàng)建的文件名, mode 權(quán)限位
    //eg.
    #include <fcntl.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    #define PERM 0755

    int main(void)
    {
    static char filename[] = “file.txt”; //會(huì)創(chuàng)建一個(gè)名為 file的txt文件
    int fd;

    fd = creat(filename,PERM);if(fd < 0)printf("[%s] create fail !!!\n",filename);elseprintf("[%s] open success !\n",filename); //輸出 open success!exit(0);

    }
    4.1 Linux 系統(tǒng)中采用三位十進(jìn)制數(shù)表示權(quán)限,如0755, 0644.
    ABCD A- 0, 表示十進(jìn)制 B-用戶 C-組用戶 D-其他用戶
    — -> 0 (no excute , no write ,no read) --x -> 1 excute, (no write, no read) -w- -> 2 write -wx -> 3 write, excute r-- -> 4 read r-x -> 5 read, excute rw- -> 6 read, write , rwx -> 7 read, write , excute
    0755-> 即用戶具有讀/寫/執(zhí)行權(quán)限,組用戶和 其它用戶具有讀寫權(quán)限; 0644->即用戶具有讀寫權(quán)限, 組用戶和 其它用戶具有只讀權(quán)限;
    一般賦予目錄0755權(quán)限,文件0644權(quán)限。

    5、函數(shù) close

    頭文件:
    #include<unistd.h>
    //功能:關(guān)閉一個(gè)已經(jīng)打開的文件
    原型
    int close(int fd)
    //參數(shù)說明: fd:是需要關(guān)閉的文件描述符
    返回值
    //成功:返回0;
    //失敗:返回-1,并設(shè)置errno

    6、函數(shù) lseek

    可以調(diào)用 lseek 顯示地為一個(gè)打開文件設(shè)置偏移量。

    7、函數(shù) read

    從打開文件中讀數(shù)據(jù)。

    8、函數(shù)write

    像打開文件寫數(shù)據(jù)

    11、原子操作

    1.函數(shù) pread 和 pwrite
    這兩種擴(kuò)展允許原子性地定位并執(zhí)行 I/O

    12、函數(shù) dup 和 dup2

    這兩個(gè)函數(shù)可用來復(fù)制一個(gè)現(xiàn)有的文件描述符。

    文件描述符:
    Linux 中一切皆文件。Linux 會(huì)給每一個(gè)文件分配一個(gè)編號(hào)(ID),這個(gè)編號(hào)就是一個(gè)整數(shù),也就是文件描述符。

    13、函數(shù) sync、fsync 和fdatasync

    延遲寫(delay write):我們向文件寫入數(shù)據(jù)時(shí),內(nèi)核通常先將數(shù)據(jù)復(fù)制到緩沖區(qū)中,然后排入隊(duì)列,晚些時(shí)候再寫入磁盤。
    這三個(gè)函數(shù)是為了保證磁盤上實(shí)際文件系統(tǒng)與緩沖區(qū)中內(nèi)容的一致性。

    14、函數(shù) fcnt1

    它可以改變已經(jīng)打開文件的屬性

    15、函數(shù) ioct1

    ioct1 函數(shù)一直是 I/O 操作的雜物箱。終端I/O是使用 ioct1最多的地方。

    16、 /dev.fd

    其目錄項(xiàng)是名為0、1、2等的文件。 打開文件 /dev/fd/n 等效于復(fù)制描述符 n(假定描述符 n 是打開的)。

    第 4 章- 文件和目錄

    1、

    2、函數(shù) stat、 fstat、fstatat 和 lstat

    功能:返回與此命名文件有關(guān)的信息結(jié)構(gòu)。

    3、文件類型

    ? 普通文件(regular file)
    ? 目錄文件(directory file)
    ? 塊特殊文件(block special file)
    ? 字符特殊文件(character special file)
    ? FIFO
    ? 套接字(socket)
    ? 符號(hào)鏈接(symbolic link)

    4、設(shè)置用戶 ID 和設(shè)置組 ID

    5、文件訪問權(quán)限

    每個(gè)文件有 9 個(gè)訪問權(quán)限位

    S_IRUSR 用戶讀
    S_IWUSR 用戶寫
    S_IXUSR 用戶執(zhí)行

    S_IRGRP 組讀
    S_IWGRP 組寫
    S_IXGRP 組執(zhí)行

    S_IROTH 其他讀
    S_IWOTH 其他寫
    S_IXOTH 其他執(zhí)行

    6、新文件和目錄的所有權(quán)

    7、函數(shù) access 和 faccessat

    這兩個(gè)函數(shù)是按實(shí)際用戶 ID 和實(shí)際組 ID 進(jìn)行訪問權(quán)限測(cè)試的。

    8、函數(shù) umask

    9、函數(shù) chmod 、fchmod 、和 fchmodat

    10、黏著位

    11、函數(shù) chown、fchown、fchownat 和 lchowm

    13、文件截?cái)?/h2>

    #include <unistd.h>
    int truncate(const char *pathname, off_t length);
    int ftruncate(int fd, off_t length);
    函數(shù) truncate 和ftruncate 可以將一個(gè)現(xiàn)有文件長(zhǎng)度截?cái)酁?length 長(zhǎng)

    14、文件系統(tǒng)

    任何一個(gè)文件可以有多個(gè)目錄指向其 i 節(jié)點(diǎn)。

    15、函數(shù) link、linkat、unlink、unlinkat 和 remove

    函數(shù)link、linkat 可以創(chuàng)建一個(gè)指向現(xiàn)有文件的鏈接。

    #include <unistd.h>
    int link(const char *existingpath, const char *newpath);
    int linkat(int efd, const char *existingpath, int nfd, const char *newpath, int flag);
    函數(shù) unlink 可以刪除一個(gè)現(xiàn)有的目錄項(xiàng)。
    #include <unistd.h>
    int unlink(const char *pathname);
    int unlink(int fd, const char *pathname, int flag);
    函數(shù) unlinkat 可以類似于 rmdir 一樣刪除目錄
    函數(shù) remove 可以解除對(duì)一個(gè)文件或目錄的鏈接。

    16、函數(shù) rename 和 renameat

    文件或目錄可以用 rename 函數(shù) 或者renameat函數(shù)進(jìn)行重命名。

    17、符號(hào)鏈接

    18、創(chuàng)建和讀取符號(hào)鏈接

    可以用 symlink 或 symlinkat函數(shù)創(chuàng)建一個(gè)符號(hào)鏈接

    19、文件的時(shí)間

    20、函數(shù) futimens、utimensat 和 utimes

    futimens 和 utimensat函數(shù)可以指定納秒級(jí)精度的時(shí)間戳。

    21、函數(shù) mkdir、mkdirat 和 rmdir

    用 mkdir 和 mkdirat 函數(shù)創(chuàng)建目錄
    用 rmdir 函數(shù)刪除目錄。

    22、讀目錄

    對(duì)某個(gè)目錄具有訪問的任一用戶都可以讀該目錄,但是為了防止文件系統(tǒng)產(chǎn)生混亂,只有內(nèi)核才能寫目錄。

    23、函數(shù) chdir、 fchdir 、 和 getcwd

    進(jìn)程調(diào)用 chdir 和 fchdir 函數(shù)可以更改當(dāng)前工作目錄。

    24、設(shè)備特殊文件

    25、文件訪問小結(jié)

    第 5 章- 標(biāo)準(zhǔn)I/O庫(kù)

    1、

    2、流和 FILE 對(duì)象

    ? 對(duì)于所有的 I/O函數(shù),都是圍繞文件描述符的;
    對(duì)于標(biāo)準(zhǔn)的 I/O庫(kù),它們的操作是圍繞 流(stream)進(jìn)行的。
    ? 流的定向(stream’s orientation)決定了所讀、寫的字符是單字節(jié)還是多字節(jié)。
    有兩個(gè)函數(shù)可以改變流的定向: freopen 、 fwide;
    => freopen函數(shù)可以清除一個(gè)流的定向;
    fwide 函數(shù)可用于設(shè)置流的定向。

    3、標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出 和標(biāo)準(zhǔn)錯(cuò)誤

    分別是: STDIN_FILENO 、STDOUT_FILENO、STDERR_FILENO

    4、緩沖

    標(biāo)準(zhǔn) I/O庫(kù)提供緩沖的目的是盡可能減少使用 read 和write調(diào)用的次數(shù)。標(biāo)準(zhǔn)I/O庫(kù)提供了三種類型的緩沖:

    ? 全緩沖:在填滿標(biāo)準(zhǔn)I/O緩沖區(qū)后才進(jìn)行實(shí)際I/O操作。
    ? 行緩沖:當(dāng)再輸入和輸出中遇到換行符時(shí),標(biāo)準(zhǔn)I/O庫(kù)執(zhí)行I/O操作。
    ? 不帶緩沖:標(biāo)準(zhǔn)I/O庫(kù)不對(duì)字符進(jìn)行緩沖存儲(chǔ)。

    5、打開流

    與以下三個(gè)函數(shù)有關(guān): fopen、 freopen、 fdopen。

    ? fopen 函數(shù)打開路徑名為 pathname 的一個(gè)指定的文件;
    ? fropen 函數(shù)在一個(gè)指定的流上打開一個(gè)指定的文件,若該流已經(jīng)打開,則先關(guān)閉該流;
    ? fdopen 函數(shù)取一個(gè)已有的文件描述符,并使一個(gè)標(biāo)準(zhǔn)的I/O流與該描述符相結(jié)合。
    6、讀和寫流
    一旦打開了流,則可在3種不同類型的非格式化I/O中進(jìn)行選擇,對(duì)其進(jìn)行讀、寫操作。
    ? 每次一個(gè)字符的I/O;
    ? 每次一行的I/O;
    ? 直接I/O。
    7、每行一次 I/O
    有兩個(gè)函數(shù)指定了緩沖區(qū)的地址,讀入的行將送入其中:fgets、gets函數(shù)。
    ? fgets 必須指定緩沖的長(zhǎng)度 n
    ? gets 函數(shù)是一個(gè)不推薦的函數(shù)。
    問題:調(diào)用子在使用gets時(shí)不能指定緩沖區(qū)的長(zhǎng)度。
    8、標(biāo)準(zhǔn) I/O 的效率
    9、二進(jìn)制 I/O
    Linux 提供了兩個(gè)函數(shù)以執(zhí)行二進(jìn)制I/O操作: fread 函數(shù) 和 fwrite函數(shù)。
    函數(shù)功能是 返回讀或?qū)懙膶?duì)象數(shù)。
    問題:它只能用于讀在同一系統(tǒng)上已寫的數(shù)據(jù)。
    10、定位流
    有三種方法定位 I/O流:
    ? ftell 和 fseek 函數(shù)。
    ? ftello 和 fseeko 函數(shù)
    ? fgetpos 和 fsetpos 函數(shù)。
    11、格式化 I/O
    ? 格式化輸出:
    由5個(gè)printf函數(shù)來處理:
    o printf:將格式化數(shù)據(jù)寫到標(biāo)準(zhǔn)輸出
    o fprintf:寫至指定的流;
    o dprintf:寫至指定的文件描述符;
    o sprintf:將格式化的字符送入數(shù)組 buf 中。
    o snprintf:能夠解決緩沖區(qū)溢出問題。
    ? 格式化輸入:
    由3個(gè) scanf函數(shù)來處理:
    o scanf 族用于分析輸入字符串,并將字符序列轉(zhuǎn)換成指定類型的變量。
    12、實(shí)現(xiàn)細(xì)節(jié)
    13、臨時(shí)文件
    ISO C標(biāo)準(zhǔn)I/O庫(kù)提供了兩個(gè)函數(shù)以幫助創(chuàng)建臨時(shí)文件。
    ? tmpnam 函數(shù)產(chǎn)生一個(gè)與現(xiàn)有文件名不同的一個(gè)有效路徑名字字符串。
    ? tmpfile 函數(shù)創(chuàng)建一個(gè)臨時(shí)二進(jìn)制文件(類型 wb+),在關(guān)閉該文件或程序結(jié)束時(shí)將自動(dòng)刪除這種文件。
    14、內(nèi)存流
    我們已經(jīng)看到,標(biāo)準(zhǔn) I/O庫(kù)把數(shù)據(jù)緩存在內(nèi)存中,因此每次一字符和每次一行的 I/O更有效。有的I/O都是通過在緩沖區(qū)主存之間來回傳送字節(jié)來完成的。
    15、標(biāo)準(zhǔn) I/O的替代軟件

    第 6 章- 系統(tǒng)數(shù)據(jù)文件和信息
    2、口令文件
    某些系統(tǒng)提供了 vipw 命令,允許管理員使用該命令編輯口令文件。vipw命令串行化地更改口令文件。
    POSIX.1定義了兩個(gè)獲取口令文件項(xiàng)的函數(shù)。在給出用戶登錄名或數(shù)值用戶ID后,這兩個(gè)函數(shù)就能查看相關(guān)項(xiàng)目:getpwuid函數(shù)、getpwnam函數(shù)。
    getpwuid: 由 ls(1)程序使用,它將i節(jié)點(diǎn)中的數(shù)字用戶ID映射為用戶登錄名。在鍵入登錄名后,getpwnam函數(shù)由login(1)程序使用。

    3、陰影口令
    為使別人難以獲得原始資料(加密口令),現(xiàn)在,某些系統(tǒng)將加密口令存放在另一個(gè)通常稱為陰影口令(shadow password)的文件中。該文件至少要包含用戶名和加密口令。
    4、組文件
    5、附屬組 ID
    1983年左右,4.2 BSD( 伯克利軟件套件 )引入了附屬組ID的概念。這樣不僅可以屬于口令文件記錄項(xiàng)中組ID所對(duì)應(yīng)的組,也可以屬于多至15個(gè)另外的組。
    6、實(shí)現(xiàn)區(qū)別
    7、其它數(shù)據(jù)文件
    8、登陸賬戶記錄
    大多數(shù)時(shí)候UNIX系統(tǒng)都提供下列兩個(gè)數(shù)據(jù)文件:
    utmp文件記錄當(dāng)前登陸到系統(tǒng)的各個(gè)用戶;
    wtmp文件跟蹤各個(gè)登陸和注銷事件。
    9、系統(tǒng)標(biāo)識(shí)
    POSIX.1(可移植操作系統(tǒng)接口)定義了uname 函數(shù),它返回與主機(jī)和操作系統(tǒng)有關(guān)的信息。
    10、時(shí)間和日期歷程

    第7章-進(jìn)程環(huán)境
    1、引言
    本章將學(xué)習(xí):
    當(dāng)程序執(zhí)行時(shí),其main函數(shù)是如何被調(diào)用的; 02
    命令行參數(shù)是如何傳遞給新程序的; 04
    典型的存儲(chǔ)空間布局是什么樣式; 06
    如何分配另外的存儲(chǔ)空間; 08
    進(jìn)程如何使用環(huán)境變量 09
    進(jìn)程的各種不同終止方式; 03
    longjmp 和 setjmp 函數(shù)以及它們與棧的交互作用。 10
    2、 main函數(shù)
    main 函數(shù)的原型是:
    int main( int argc, char *argv[] )
    其中 argc 是命令行參數(shù)的數(shù)目; argv是指向參數(shù)的各個(gè)指針?biāo)鶚?gòu)成的數(shù)組( 存放命令行每個(gè)字符串的首地址)。
    在調(diào)用 mian 函數(shù)前先調(diào)用一個(gè)特殊的 啟動(dòng)例程??蓤?zhí)行程序文件將此啟動(dòng)例程指定為程序的起始地址——這是由 連接編輯器設(shè)置的,而連接編輯器則是由 C 編譯器調(diào)用。
    3、進(jìn)程終止
    有8種方式使進(jìn)程終止(termination):
    5種正常終止:
    ? 從 main 返回;
    ? 調(diào)用 exit;
    ? 調(diào)用 _exit 或 _Exit;
    ? 最后一個(gè)線程從其啟動(dòng)歷程返回 (11.5節(jié))
    ? 從最后一個(gè)線程調(diào)用 pthread_exit; (11.5節(jié))
    3種異常終止:
    ? 調(diào)用 abort (10.17節(jié))
    ? 接到一個(gè)信號(hào) (10.2節(jié))
    ? 最后一個(gè)線程對(duì)取消請(qǐng)求作出響應(yīng)(11.5節(jié)、12.7節(jié))
    3.1- 退出函數(shù)
    有 3 個(gè)函數(shù)可用于正常終止一個(gè)程序:
    ? _exit 和 _Exie 會(huì)立即進(jìn)入內(nèi)核;
    ? exit 則先執(zhí)行一些清理處理,然后返回內(nèi)核。
    這3個(gè)退出函數(shù)都帶一個(gè)整形參數(shù),稱為 終止?fàn)顟B(tài)。
    若 main 的返回類型是整形, 并且 main 執(zhí)行到最后一條語(yǔ)句時(shí)返回(隱式返回),那么該進(jìn)程的終止?fàn)顟B(tài)是 0。
    于是: main函數(shù)中的 return 0; 等價(jià)于 exit(0);
    3.2- 函數(shù) atexit
    按照國(guó)際標(biāo)準(zhǔn)化組織的規(guī)定,一個(gè)進(jìn)程可以登記多至32個(gè)終止處理程序(exit handler)的函數(shù),這些函數(shù)將由 exit 自動(dòng)調(diào)用,系統(tǒng)同時(shí)調(diào)用 atexit 函數(shù)來登記這些函數(shù)。
    4、命令行參數(shù)
    當(dāng)執(zhí)行一個(gè)程序時(shí),調(diào)用 exec 的進(jìn)程可將命令行參數(shù)傳遞給該新程序。
    5、環(huán)境表
    每個(gè)程序都接收到一張環(huán)境表。
    與參數(shù)表一樣,環(huán)境表也是一個(gè)字符指針,其中每個(gè)指針包含一個(gè)以 null 結(jié)束的 C 字符串的地址。
    全局變量 環(huán)境指針( environ) 則包含了該指針數(shù)組的地址:
    extern char **environ;
    6、 C程序的存儲(chǔ)空間布局
    歷史沿襲至今,C程序一直由下列幾部分組成:
    ? 正文段;
    ? 初始化數(shù)據(jù)段;
    ? 未初始化數(shù)據(jù)段;
    ? 棧;
    ? 堆。
    7、共享庫(kù)
    共享庫(kù)使得可執(zhí)行文件中不再需要包含公用的庫(kù)函數(shù),而只需在所有進(jìn)程都可引用的存儲(chǔ)區(qū)中保存這種庫(kù)例進(jìn)程的一個(gè)副本。
    8、存儲(chǔ)空間分配
    國(guó)際標(biāo)準(zhǔn)組織 說明了 3 個(gè)用于存儲(chǔ)空間動(dòng)態(tài)分配的函數(shù):
    ? malloc : 分配指定字節(jié)數(shù)的存儲(chǔ)區(qū);
    ? calloc : 為指定數(shù)量指定長(zhǎng)度的對(duì)象分配存儲(chǔ)空間;
    ? realloc : 增加或減少以前分配區(qū)的長(zhǎng)度。
    9、環(huán)境變量
    環(huán)境字符串的形式是:
    name = value
    國(guó)際標(biāo)準(zhǔn)化組織 C 定義了一個(gè)函數(shù) getenv, 可以用其取環(huán)境變量值,但是該標(biāo)準(zhǔn)又稱環(huán)境的內(nèi)容是由實(shí)現(xiàn)定義的。
    10、函數(shù) setjmp 和 longjmp
    在 C 中,goto 語(yǔ)句不能跨越函數(shù),而 setjmp 和 longjmp 函數(shù)可以。
    這兩個(gè)函數(shù)對(duì)于處理發(fā)生在很深層嵌套函數(shù)調(diào)用中的出錯(cuò)情況是非常有用的。
    11、函數(shù) getrlimit 和setrlimit
    函數(shù) getrlimit 和 setrlimit 可以進(jìn)行查詢和更改資源限制。
    對(duì)這兩個(gè)函數(shù)的每一次調(diào)用都指定一個(gè)資源以及一個(gè)指向下列結(jié)構(gòu)的指針。
    12、小結(jié)
    本章說明了:
    ? 一個(gè)進(jìn)程是如何啟動(dòng)和終止的;
    ? 如何向其傳遞參數(shù)表和環(huán)境;
    ? C 程序的典型存儲(chǔ)空間布局;
    ? 一個(gè)進(jìn)程如何動(dòng)態(tài)地分配和釋放存儲(chǔ)空間;
    ? setjmp 和 longjmp 函數(shù),他們提供了一種在進(jìn)程內(nèi)非局部轉(zhuǎn)移的方法。

    第 8 章-進(jìn)程控制
    1、引言
    本章介紹 UNIX 系統(tǒng)的進(jìn)程控制,包括:創(chuàng)建新進(jìn)程、執(zhí)行程序和進(jìn)程終止。
    還將說明進(jìn)程屬性的各種 ID ——實(shí)際、有效和保存的用戶 ID 和組ID ,以及它們?nèi)绾问艿竭M(jìn)程控制原語(yǔ)的影響。
    2、進(jìn)程標(biāo)識(shí)
    每個(gè)進(jìn)程都有一個(gè)非負(fù)整數(shù)表示的唯一進(jìn)程 ID 。P.S. 雖然進(jìn)程 ID 是唯一的,但是當(dāng)一個(gè)進(jìn)程終止后,其進(jìn)程 ID 就稱為復(fù)用的候選者。
    系統(tǒng)中有一些專用進(jìn)程 ID:
    ? ID 為 0 的進(jìn)程通常是調(diào)度進(jìn)程,也被稱為 交換進(jìn)程(swapper) ,它并不執(zhí)行任何磁盤上的程序,因此也被稱為系統(tǒng)進(jìn)程。
    ? ID 為 1 通常是 init 進(jìn)程,次進(jìn)程負(fù)責(zé)在自舉內(nèi)核后啟動(dòng)一個(gè) UNIX 系統(tǒng)。
    ? ID 為 2 是頁(yè)守護(hù)進(jìn)程( page daemon),此進(jìn)程負(fù)責(zé)支持虛擬存儲(chǔ)器系統(tǒng)的分頁(yè)操作。
    3、函數(shù) fork
    fork() 系統(tǒng)調(diào)用通過復(fù)制一個(gè)現(xiàn)有進(jìn)程來創(chuàng)建一個(gè)全新的進(jìn)程(進(jìn)程的另外一個(gè)名字叫做任務(wù))。
    由 fork 創(chuàng)建的新進(jìn)程被稱為 子進(jìn)程(child process)
    fork 函數(shù)被調(diào)用一次,但返回兩次。兩次返回的區(qū)別是子進(jìn)程的返回值是 0 ,而父進(jìn)程的返回值則是新建子進(jìn)程的進(jìn)程 ID。
    子進(jìn)程是父進(jìn)程的副本。eg. 子進(jìn)程獲得父進(jìn)程數(shù)據(jù)空間、堆和棧的副本,父進(jìn)程和子進(jìn)程并不共享這些存儲(chǔ)空間。
    4、函數(shù) vfork
    vfork 函數(shù)的調(diào)用序列和返回值與 fork 相同,但 兩者 的語(yǔ)義不同。
    vfork 函數(shù)用于創(chuàng)建一個(gè)新進(jìn)程,而該新進(jìn)程的目的是執(zhí)行一個(gè)新程序。但是 vfork 和 fork還是有 2 點(diǎn)不同的(書 p .187)
    5、函數(shù) exit
    詳細(xì)介紹了 5 中正常終止及 3 種異常終止的方式。
    終止函數(shù): exit 、 _exit、 _Exit,它們終止后,會(huì)給父進(jìn)程傳遞退出狀態(tài)( exit status )的參數(shù)。
    僵死進(jìn)程: 一個(gè)已經(jīng)終止、但是其父進(jìn)程尚未對(duì)其進(jìn)行善后處理 (獲取終止子進(jìn)程的有關(guān)信息、釋放它仍占用的資源)的進(jìn)程被稱為僵死進(jìn)程。
    6、 函數(shù) wait 和 waitpid
    當(dāng)一個(gè)進(jìn)程正?;虍惓=K止時(shí),內(nèi)核就向其父進(jìn)程發(fā)送 SIGCHLD 信號(hào)。
    一個(gè)進(jìn)程有多個(gè)子進(jìn)程,只要有一個(gè)子進(jìn)程終止, wait 就返回。
    大家知道,當(dāng)用fork啟動(dòng)一個(gè)新的子進(jìn)程的時(shí)候,子進(jìn)程就有了新的生命周期,并將在其自己的地址空間內(nèi)獨(dú)立運(yùn)行。但有的時(shí)候,我們希望知道某一個(gè)自己創(chuàng)建的子進(jìn)程何時(shí)結(jié)束,從而方便父進(jìn)程做一些處理動(dòng)作。同樣的,在用 ptrace 去 attach 一個(gè)進(jìn)程滯后,那個(gè)被 attach 的進(jìn)程某種意義上說可以算作那個(gè) attach 它進(jìn)程的子進(jìn)程,這種情況下,有時(shí)候就想知道被調(diào)試的進(jìn)程何時(shí)停止運(yùn)行。
    以上兩種情況下,都可以使用 Linux 中的 waitpid() 函數(shù)做到。先來看看waitpid函數(shù)的定義:
    如果在調(diào)用waitpid()函數(shù)時(shí),當(dāng)指定等待的子進(jìn)程已經(jīng)停止運(yùn)行或結(jié)束了,則waitpid()會(huì)立即返回;但是如果子進(jìn)程還沒有停止運(yùn)行或結(jié)束,則調(diào)用waitpid()函數(shù)的父進(jìn)程則會(huì)被阻塞,暫停運(yùn)行。
    調(diào)用 wait 或 waitpid 的進(jìn)程可能會(huì)放生什么?
    ? 如果其所有子進(jìn)程都還在運(yùn)行,則阻塞;
    ? 如果一個(gè)子進(jìn)程已終止,正等待父進(jìn)程獲得其終止?fàn)顟B(tài),則取得該子進(jìn)程的終止?fàn)顟B(tài)立即返回;
    ? 如果它沒有任何子進(jìn)程,則立即出錯(cuò)返回。
    ? waitpod 函數(shù)提供了 wait 函數(shù)沒有提供的 3 個(gè)功能:
    7、函數(shù) waitid
    UNIX 包含了另一個(gè)取得進(jìn)程終止?fàn)顟B(tài)的函數(shù)—— waitid , 此函數(shù)類似于 waitpid,但提供了更多的靈活性。
    waitid 函數(shù)允許一個(gè)進(jìn)程指定要等待的子進(jìn)程。
    8、函數(shù) wait3 和 wait4
    大多數(shù) UNIX 系統(tǒng)實(shí)現(xiàn)提供了另外兩個(gè)函數(shù) wait3 和 wait4。
    相較于函數(shù) wait 、 waitpid 、waitid 所提供的功能要多一個(gè),這與附加參數(shù)有關(guān)。該參數(shù)允許內(nèi)核返回由終止進(jìn)程及其所有子進(jìn)程使用的資源概況,包括: CPU時(shí)間總量、系統(tǒng)CPU時(shí)間總量、缺頁(yè)次數(shù)、接收到信號(hào)的次數(shù)等。
    9、競(jìng)爭(zhēng)條件
    當(dāng)多個(gè)進(jìn)程都企圖對(duì)共享數(shù)據(jù)進(jìn)行某種處理,而最后的結(jié)果又取決于進(jìn)程運(yùn)行的順序時(shí),我們認(rèn)為發(fā)生了競(jìng)爭(zhēng)關(guān)系( race condition )。
    10、函數(shù) exec
    在 “3-函數(shù) fork” 中提到:用 fork 函數(shù)創(chuàng)建新的子進(jìn)程后,子進(jìn)程往往要調(diào)用一種 exec 函數(shù)以執(zhí)行另一個(gè)程序。
    當(dāng)進(jìn)程 調(diào)用一種 exec 函數(shù)時(shí),該進(jìn)程執(zhí)行的程序完全替換為 新程序,而新程序是從其 main 函數(shù)開始執(zhí)行。
    因?yàn)檎{(diào)用 exec 并不創(chuàng)建新進(jìn)程,所以前后的進(jìn)程 ID 并未改變。 exec 只是用磁盤上的一個(gè)新程序替換了當(dāng)前進(jìn)程的正文段、數(shù)據(jù)段、堆段和棧段。
    11、更改用戶 ID 和 更改組 ID
    在 UNIX 系統(tǒng)中,特權(quán)(如能改變當(dāng)前日期的表示法)以及訪問控制(如能否讀、寫一個(gè)特定文件),是基于用戶 ID 和 組 ID 的。
    當(dāng)程序需要增加特權(quán),或需要訪問當(dāng)前不允許訪問的資源時(shí),我們需要更換自己的用戶 ID 或 組 ID,使得新 ID 具有合適的特權(quán)或訪問權(quán)限。當(dāng)程序需要降低其特權(quán)或阻止對(duì)某些資源的訪問時(shí),也需要更換用戶 ID 或組 ID,新 ID 不具有相應(yīng)特權(quán)或訪問這些資源的能力。
    12、解釋器文件
    解釋器文件是一種文本文件。
    13、函數(shù) system
    ISO C定義了 system函數(shù),它總共有 3 種返回值。
    相較于 fork 、 exec, system的優(yōu)點(diǎn)為: system進(jìn)行了所需的各種出錯(cuò)處理以及各種信號(hào)處理。
    14、 進(jìn)程會(huì)計(jì)
    大多數(shù) UNIX 系統(tǒng)提供了一個(gè)選項(xiàng)以進(jìn)行 進(jìn)程會(huì)計(jì)( process accounting )處理。
    啟用該選項(xiàng)后,每當(dāng)進(jìn)程結(jié)束時(shí)內(nèi)核就寫一個(gè)會(huì)計(jì)記錄。一般進(jìn)程會(huì)計(jì)包括: 命令名、所使用的 CPU 時(shí)間總量、用戶 ID 和 組 ID 、啟動(dòng)時(shí)間等。
    15、用戶標(biāo)識(shí)
    任一進(jìn)程都可以得到其實(shí)際用戶 ID 和有效用戶 ID 及組 ID。
    但是,有時(shí)候我們希望找到運(yùn)行該程序用戶的登陸名。系統(tǒng)通常記錄用戶登陸時(shí)使用的名字,然后用 getlogin 函數(shù)可以獲取此登錄名。
    如果調(diào)用此函數(shù)的進(jìn)程沒有連接到用戶登陸時(shí)所用的終端,則函數(shù)失敗。通常稱這些進(jìn)程為 守護(hù)進(jìn)程( daemon )
    16、 進(jìn)程調(diào)度
    調(diào)度策略和調(diào)度優(yōu)先級(jí)是有內(nèi)核確定的。
    進(jìn)程可以通過調(diào)整 友好值 選擇以更優(yōu)先級(jí)運(yùn)行(通過調(diào)整友好值降低它對(duì) CPU 的占有,因此該進(jìn)程是有好的)。只有特權(quán)進(jìn)程允許提高調(diào)度權(quán)限。
    友好值越小,優(yōu)先級(jí)越高(越靠前嘛!)。
    進(jìn)程可以通過 nice 函數(shù)獲取或更改它的友好值。使用這個(gè)函數(shù),進(jìn)程只能影響自己的友好值,不能影響任何其它進(jìn)程的友好值。
    17、進(jìn)程時(shí)間
    在 書 p16中說明了可以度量的 3 個(gè)時(shí)間:墻上時(shí)鐘時(shí)間、用戶 CPU時(shí)間 和 系統(tǒng) CPU時(shí)間。
    任一進(jìn)程都可以調(diào)用 times 函數(shù)獲得它自己以及終止子進(jìn)程的上述值。
    18、小結(jié)
    UNIX 必須掌握的幾個(gè)函數(shù): fork、exec系列、 _exit、wait、waitpid。
    ? fork:用來創(chuàng)建新的進(jìn)程;
    ? exec:用 fork 函數(shù)創(chuàng)建新的子進(jìn)程后,子進(jìn)程往往要調(diào)用一種 exec 函數(shù)才能執(zhí)行另一個(gè)程序;
    ? _exit:給父進(jìn)程傳遞退出狀態(tài)( exit status )的參數(shù);
    ? wait、waitpid:我們希望知道某一個(gè)自己創(chuàng)建的子進(jìn)程何時(shí)結(jié)束;
    ? 本章說明了 system函數(shù)和進(jìn)程會(huì)計(jì),這也使我們進(jìn)一步了解所有這些進(jìn)程控制函數(shù)。
    system進(jìn)行了所需的各種出錯(cuò)處理以及各種信號(hào)處理
    ? 本章還說明了 exec函數(shù)的另一種變體:解釋器文件及它們的工作方式。
    ? 對(duì)各種不同的用戶 ID 和組 ID(實(shí)際、有效 和 保存的)的理解,對(duì)編寫安全的設(shè)置用戶 ID 程序是至關(guān)重要的。
    在 UNIX 系統(tǒng)中,特權(quán)(如能改變當(dāng)前日期的表示法)以及訪問控制(如能否讀、寫一個(gè)特定文件),是基于用戶 ID 和 組 ID 的。
    當(dāng)程序需要增加特權(quán),或需要訪問當(dāng)前不允許訪問的資源時(shí),我們需要更換自己的用戶 ID 或 組 ID,使得新 ID 具有合適的特權(quán)或訪問權(quán)限。當(dāng)程序需要降低其特權(quán)或阻止對(duì)某些資源的訪問時(shí),也需要更換用戶 ID 或組 ID,新 ID 不具有相應(yīng)特權(quán)或訪問這些資源的能力。

    第 9 章-進(jìn)程關(guān)系
    1、引言
    本章將詳細(xì)地說明進(jìn)程組 以及 POSIX.1(可一只操作系統(tǒng)接口)引入的會(huì)話的概念。還將介紹登陸 shell(登錄時(shí)所調(diào)用的)和所有從登陸 shell 啟動(dòng)的進(jìn)程之間的關(guān)系。
    2、終端登陸
    系統(tǒng)經(jīng)由內(nèi)核中的終端設(shè)備驅(qū)動(dòng)程序。
    4 種終端登陸方式:
    ? BSD 終端登陸 ( Berkeley Software Distribution 伯克利軟件套件)
    ? Mac OS X 終端登陸
    ? Linux 終端登陸
    ? Solaris 終端登錄
    3、網(wǎng)絡(luò)登陸
    通過串行終端登錄至系統(tǒng)和經(jīng)由網(wǎng)絡(luò)登陸至系統(tǒng)兩者之間主要(物理上的)區(qū)別是:網(wǎng)絡(luò)登錄時(shí),在終端和計(jì)算機(jī)之間的連接不再是點(diǎn)到點(diǎn)的。在網(wǎng)絡(luò)登陸情況下, login僅僅是一種可用的服務(wù),這與其它網(wǎng)絡(luò)服務(wù)(如 FTP 或 SMTP)的性質(zhì)相同。
    在 9.2 的終端登錄中, init 知道哪些終端設(shè)備可用來進(jìn)行登陸,并為每個(gè)設(shè)備生成一個(gè) getty 進(jìn)程。但是,對(duì)網(wǎng)絡(luò)登陸情況則有所不同,所有登陸都經(jīng)由內(nèi)核的網(wǎng)絡(luò)接口驅(qū)動(dòng)程序(如 以太網(wǎng)驅(qū)動(dòng)程序 )。
    為使同一個(gè)軟件既能處理終端設(shè)備,又能處理網(wǎng)絡(luò)登陸,系統(tǒng)使用了一種稱為 偽終端(pseudo terminal )的軟件驅(qū)動(dòng)程序,它仿真串行終端的運(yùn)行行為,并將終端操作映射為網(wǎng)絡(luò)操作。
    有以下四種登陸方式:
    ? BSD 網(wǎng)絡(luò)登陸
    ? Mac OS X 網(wǎng)絡(luò)登陸
    ? Linux 網(wǎng)絡(luò)登錄
    ? Solaris 網(wǎng)絡(luò)登陸
    4、進(jìn)程組
    每個(gè)進(jìn)程除了有一個(gè)進(jìn)程 ID 之外,還屬于一個(gè)進(jìn)程組。進(jìn)程組是一個(gè)或多個(gè)進(jìn)程的集合。
    每個(gè)進(jìn)程組有一個(gè)唯一的進(jìn)程組 ID,進(jìn)程組 ID 類似于進(jìn)程 ID ——它是一個(gè)正整數(shù),并可存放在 pid_t 數(shù)據(jù)類型中。
    進(jìn)程調(diào)用 setpgid 函數(shù) 可以加入一個(gè)現(xiàn)有的進(jìn)程組或者創(chuàng)建一個(gè)新進(jìn)程組。
    #include <unistd.h>
    int setpgid( pid_t pid, pid_t pgid);

    //返回值:若成功,返回0; 若出錯(cuò),返回 -1
    setpgid 函數(shù) 將 pid 進(jìn)程的進(jìn)程組 ID 設(shè)置為 pgid。
    一個(gè)進(jìn)程只能為它自己或它的子進(jìn)程設(shè)置進(jìn)程組 ID。 在它的子進(jìn)程調(diào)用了 exec 后,它就不再改該子進(jìn)程的進(jìn)程組 ID。
    5、會(huì)話
    會(huì)話( session ) 是一個(gè)或多個(gè)進(jìn)程組的集合。
    通常是由 shell 的管道將幾個(gè)進(jìn)程編成一組的。
    進(jìn)程調(diào)用 setsid 函數(shù)建立一個(gè)新會(huì)話。
    #include <unistd.h>
    pid_t setsid(void);
    //返回值:若成功,返回進(jìn)程組 ID; 若出錯(cuò),返回 -1
    ? 如果該調(diào)用進(jìn)程已經(jīng)是一個(gè)進(jìn)程組的組長(zhǎng),則此函數(shù)返回出錯(cuò)(有具體解決方法);
    ? 如果調(diào)用此函數(shù)的進(jìn)程不是一個(gè)進(jìn)程組的組長(zhǎng),則此函數(shù)創(chuàng)建一個(gè)新會(huì)話。(具體會(huì)發(fā)生 3 件事)
    6、控制終端
    會(huì)話 和 進(jìn)程組還有一些其它特性:
    ? 一個(gè)會(huì)話可以有一個(gè)控制終端( controlling terminal )。這通常是終端設(shè)備(在終端登錄情況下)或偽終端設(shè)備(在網(wǎng)絡(luò)登陸情況下)。
    ? 建立與控制終端連接的會(huì)話首進(jìn)程被稱為 控制進(jìn)程( controlling process )
    ? 一個(gè)會(huì)話的幾個(gè)進(jìn)程組可被分成一個(gè) 前臺(tái)進(jìn)程組( foreground process group )以及一個(gè)或多個(gè) 后臺(tái)進(jìn)程組( background process group )。
    ? 如果一個(gè)會(huì)話有一個(gè)控制終端,則它有一個(gè)前臺(tái)進(jìn)程組,其他進(jìn)程組稱為后臺(tái)進(jìn)程組。
    7、函數(shù) tcgetpgrp、 tcsetpgrp 和 tcgetsid
    有時(shí)候需要有一種方法來通知內(nèi)核哪一個(gè)進(jìn)程組是前臺(tái)進(jìn)程組,這樣,終端設(shè)備驅(qū)動(dòng)程序就能知道將終端輸入和終端產(chǎn)生的信號(hào)發(fā)往何處。
    函數(shù) tcgetpgrp 返回前臺(tái)進(jìn)程組 ID,它與在 fd 上打開的終端相關(guān)聯(lián)。
    如果進(jìn)程有一個(gè)控制終端,則該進(jìn)程可以調(diào)用 tcsetpgrp 將前臺(tái)進(jìn)程組 ID 設(shè)置為 pgrpid。
    大多數(shù)應(yīng)用程序并不直接調(diào)用這兩個(gè)函數(shù)。他們通常由 作業(yè)控制 shell調(diào)用。
    需要管理控制終端的應(yīng)用程序可以調(diào)用 tcgetsid 函數(shù)識(shí)別出控制終端的會(huì)話首選進(jìn)程的 會(huì)話ID (它等價(jià)于會(huì)話首進(jìn)程的進(jìn)程組 ID)
    8、作業(yè)控制
    作業(yè)控制是 BSD 在 1980年左右增加的一個(gè)新特性。它允許在一個(gè)終端是啟動(dòng)多個(gè)作業(yè)(進(jìn)程組),它控制哪一個(gè)作業(yè)可以訪問該終端以及哪些作業(yè)再后臺(tái)運(yùn)行。
    一個(gè)作業(yè)只是幾個(gè)進(jìn)程的集合,通常是一個(gè)進(jìn)程管道。
    作業(yè)控制要求一下 3 種形式的支持:

  • 支持作業(yè)控制的 shell;
  • 內(nèi)核中的終端驅(qū)動(dòng)程序必須支持作業(yè)控制;
  • 內(nèi)核必須提供對(duì)某些作業(yè)控制信號(hào)的支持。
    9、 shell 執(zhí)行程序
    PID: (Process ID) 進(jìn)程 ID號(hào)
    PPID: (Parent process) ID 父進(jìn)程 ID號(hào)
    PGID: (Process Group ID) 進(jìn)程組 ID號(hào)
    SID: (Session ID) 會(huì)話ID
    10、孤兒進(jìn)程組
    一個(gè)其父進(jìn)程已終止的進(jìn)程稱為 孤兒進(jìn)程(orphan process ),這種進(jìn)程由 init 進(jìn)程“收養(yǎng)”。
    孤兒進(jìn)程組:( orphaned process group ):
    ? 該組中每個(gè)成員的父進(jìn)程要么是該組的一個(gè)成員,要么不是該組所屬會(huì)話的成員。
    ? (另一種描述)一個(gè)進(jìn)程組不是孤兒進(jìn)程組的條件是——該組中有一個(gè)進(jìn)程,其父進(jìn)程在屬于同一會(huì)話的另一個(gè)組中。如果進(jìn)程組不是孤兒進(jìn)程組,那么在屬于同一會(huì)話的另一個(gè)組中的父進(jìn)程就有機(jī)會(huì)重新啟動(dòng)該組中停止的進(jìn)程。
    11、 FreeBSD 實(shí)現(xiàn)
    12、小結(jié)
  • 第 10 章- 信號(hào)
    1、引言
    本章先對(duì)信號(hào)機(jī)制進(jìn)行綜述,并說明每種信號(hào)的一般用法。
    然后分析早期實(shí)現(xiàn)的問題。
    在分析存在的問題之后再說明解決這些問題的方法,這種安排有助于加深對(duì)改進(jìn)機(jī)制的理解。
    2、信號(hào)概念
    定義:
    信號(hào)更多的是通知事件的發(fā)生。信號(hào)產(chǎn)生之后第一時(shí)間也不是直接處理而是先存儲(chǔ)下來。
    流程:
    信號(hào)的產(chǎn)生—>信號(hào)的注冊(cè)—>信號(hào)的阻塞(不處理)—>信號(hào)的注銷—>信號(hào)的處理。
    分類:
    ① 不可靠信號(hào)(非實(shí)時(shí)信號(hào)):1~31
    ② 可靠信號(hào)(實(shí)時(shí)信號(hào)):34~64
    Linux下有62種信號(hào),使用kill -l 命令查看
    每個(gè)信號(hào)都有一個(gè)名字。這些名字都以 3 個(gè)字符 SIG 開頭。
    e.g. SIGABRT 是夭折信號(hào),當(dāng)進(jìn)程調(diào)用 about 函數(shù)時(shí)產(chǎn)生這種信號(hào);
    SIGALRM 是鬧鐘信號(hào),由 alarm 函數(shù)設(shè)置的定時(shí)器超時(shí)后將產(chǎn)生此信號(hào);
    不存在編號(hào)為 0 的信號(hào),因?yàn)?#xff08;10.9節(jié))kill 函數(shù)對(duì)信號(hào)編號(hào) 0 有特殊的應(yīng)用。
    3、函數(shù) signal
    UNIX 系統(tǒng)信號(hào)機(jī)制最簡(jiǎn)單的接口是 signal 函數(shù)。
    當(dāng)指定函數(shù)地址時(shí),則在信號(hào)發(fā)生時(shí),調(diào)用該函數(shù),我們稱這種處理為捕捉該信號(hào),稱此函數(shù)為信號(hào)處理程序( signal handler )或信號(hào)捕捉函數(shù)( signal-catching function )。
    signal 函數(shù)原型說明此函數(shù)要求兩個(gè)參數(shù),返回一個(gè)函數(shù)指針,而該指針?biāo)赶虻暮瘮?shù)無返回值( void )。
    ? 程序啟動(dòng)
    當(dāng)執(zhí)行一個(gè)程序時(shí),所有信號(hào)的狀態(tài)都是系統(tǒng)默認(rèn)或忽略。
    ? 進(jìn)程創(chuàng)建
    當(dāng)一個(gè)進(jìn)程調(diào)用 fork 時(shí),其子進(jìn)程繼承父進(jìn)程的信號(hào)處理方式。
    4、不可靠的信號(hào)
    不可靠在這里指的是:信號(hào)可能會(huì)丟失。
    5、終端的系統(tǒng)調(diào)用
    早期 UNIX 系統(tǒng)的一個(gè)特性是: 如果進(jìn)程在執(zhí)行一個(gè)低速系統(tǒng)調(diào)用而阻塞期間捕捉到一個(gè)信號(hào),則該系統(tǒng)調(diào)用就被終端不再繼續(xù)執(zhí)行。
    該系統(tǒng)調(diào)回返回出錯(cuò),其 error 設(shè)置為 EINTR。
    6、可重入函數(shù)
    7、 SIGCLD語(yǔ)義
    8、可靠信號(hào)術(shù)語(yǔ)和語(yǔ)義
    每個(gè)進(jìn)程都有一個(gè) 信號(hào)屏蔽字( signal mask ),它規(guī)定了當(dāng)前要阻塞遞送到該進(jìn)程的信號(hào)集。
    對(duì)于每種可能的信號(hào),該屏蔽字中都有一位與之對(duì)應(yīng),對(duì)于某種信號(hào),若其對(duì)應(yīng)位已設(shè)置,則它當(dāng)前是被阻塞的。進(jìn)程可以調(diào)用 sigprocmask(10.2節(jié))來檢測(cè)和更改其當(dāng)前信號(hào)屏蔽字。
    9、函數(shù) kill 和 raise
    kill 函數(shù)將信號(hào)發(fā)送給進(jìn)程或進(jìn)程組; raise 函數(shù)則允許進(jìn)程向自身發(fā)送信號(hào)。
    如前所述,進(jìn)程將信號(hào)發(fā)送給其它進(jìn)程需要權(quán)限。超級(jí)用戶可將信號(hào)發(fā)送給任一進(jìn)程。對(duì)于非超級(jí)用戶,其基本規(guī)則是發(fā)送者的實(shí)際用戶 ID 或有效用戶 ID 必須等于接受者的實(shí)際用戶 ID 或有效用戶 ID。
    10、函數(shù) alarm 和 pause
    使用 alarm 函數(shù)可以設(shè)置一個(gè)定時(shí)器(鬧鐘時(shí)間),在將來的某個(gè)時(shí)刻該定時(shí)器會(huì)超時(shí)。當(dāng)定時(shí)器超時(shí)時(shí),產(chǎn)生 SIGALRM 信號(hào)。
    每個(gè)進(jìn)程只能有一個(gè)鬧鐘時(shí)間。
    pause 函數(shù)使調(diào)用者進(jìn)程掛起直至捕捉到一個(gè)信號(hào)。
    只有執(zhí)行了一個(gè)信號(hào)處理程序并從其返回時(shí), pause才返回。在這種情況下, pause 返回 -1,errno設(shè)置為 EINTR。
    11、信號(hào)集
    數(shù)據(jù)集 用來告訴內(nèi)核不允許發(fā)生該信號(hào)集中的信號(hào)。
    函數(shù) sigemptyset 初始化由 set 指向的信號(hào)集,清除其中所有信號(hào)。 函數(shù) sigfillset 初始化由 set 指向的信號(hào)集,使其包括所有信號(hào)。所有應(yīng)用程序在使用信號(hào)集前,要對(duì)該信號(hào)集調(diào)用 sigemptyset 或 sigfillset 一次。這是因?yàn)?C 編譯器程序?qū)?不賦初值的 外部變量和靜態(tài)變量都初始化為 0。
    12、 函數(shù) sigprocmask
    在(10.8)中提及一個(gè)進(jìn)程的信號(hào)屏蔽字規(guī)定了當(dāng)前阻塞而不能遞送給該進(jìn)程的信號(hào)集。調(diào)用函數(shù) sigprocmask 可以檢測(cè)或更改,或同時(shí)進(jìn)行檢測(cè)和更改進(jìn)程的信號(hào)屏蔽字。
    13、函數(shù) sigpending
    sigpending 函數(shù)返回一信號(hào)集,對(duì)于調(diào)用進(jìn)程而言,其中的各信號(hào)是阻塞不能遞送的,因而也一定是當(dāng)前未決的。 該信號(hào)集通過 set 參數(shù)返回。
    14、函數(shù) sigaction
    sigaction 函數(shù)的功能是檢查或修改(或檢查并修改)與指定信號(hào)相關(guān)聯(lián)的處理動(dòng)作。此函數(shù)取代了 UNIX 早起版本使用的 signal 函數(shù)。
    15、 函數(shù) sigsetjmp 和 siglongjmp

    16、函數(shù) sigsuspend
    更改進(jìn)程的信號(hào)屏蔽字可以阻塞所選擇的信號(hào),或解除對(duì)它們的阻塞。使用這種技術(shù)可以保護(hù)不希望由信號(hào)中斷的代碼臨界區(qū)。
    17、 函數(shù) abort
    abort 函數(shù)的功能是使 程序異常終止。
    該函數(shù)將 SIGABRT信號(hào)發(fā)送給調(diào)用進(jìn)程(進(jìn)程不應(yīng)忽略此信號(hào))。 ISO C 規(guī)定,調(diào)用 abort將向主機(jī)環(huán)境遞送一個(gè)未成功終止的通知,其方法是調(diào)用 raise(SIGABRT) 函數(shù)。
    18、函數(shù) system
    POSIX.1 要求 system 忽略 SIGINT 和 SIGQUIT ,阻塞 SIGCHLD。
    system 的返回值
    注意 system 的返回值,它是 shell 的終止?fàn)顟B(tài),但 shell 的終止?fàn)顟B(tài)并不總是執(zhí)行命令字符串進(jìn)程的終止?fàn)顟B(tài)。
    19、函數(shù) sleep、nanosleep 和 clock_nanosleep
    這本書中很多例子中都已經(jīng)使用了 sleep 函數(shù)。

    nanosleep 函數(shù)與 sleep函數(shù)類似,但是它提供了納秒級(jí)的精度。這個(gè)函數(shù)掛起調(diào)用進(jìn)程,知道要求的時(shí)間已經(jīng)超時(shí)或者某個(gè)信號(hào)中斷了該函數(shù)。
    20、函數(shù) sigqueue
    除了對(duì)信號(hào)排隊(duì)以外,這些擴(kuò)展允許應(yīng)用程序在遞交信號(hào)時(shí)傳遞更多的信息。這些信息嵌入在 siginfo 結(jié)構(gòu)中。除了系統(tǒng)提供的信息,應(yīng)用程序還可以想信號(hào)處理程序傳遞整數(shù)或者指向包含更多信息的緩沖區(qū)指針。
    sigqueue 函數(shù)只能吧信號(hào)發(fā)送給單個(gè)進(jìn)程,可以使用 value 參數(shù)想信號(hào)處理程序傳遞整數(shù)和指針值,除此之外, sigqueue 函數(shù)與 kill 函數(shù)類似。
    21、作業(yè)控制信號(hào)
    POSIX.1 認(rèn)為有以下 6 個(gè)與作業(yè)控制有關(guān):
    除了 SIGCHLD 以外,大多數(shù)應(yīng)用程序并不處理這些信息,交互式 shell 則通常會(huì)處理這些信號(hào)的所有工作。
    當(dāng)我們通知 shell 在前臺(tái)或后臺(tái)回復(fù)運(yùn)行一個(gè)作業(yè)時(shí), shell 向該作業(yè)中的所有進(jìn)程發(fā)送 SIGCONT 信號(hào)。
    22、信號(hào)名和編號(hào)
    可以使用 psignal 函數(shù)可移植地打印與信號(hào)編號(hào)對(duì)應(yīng)的字符串。
    如果在 sigaction 信號(hào)處理程序中有 siginfo 結(jié)構(gòu),可以使用 psiginfo 函數(shù)打印信號(hào)信息。
    23、小結(jié)
    本章 說明了早起信號(hào)實(shí)現(xiàn)的問題以及它們是如何顯現(xiàn)出來的。
    然后介紹了 POSIX.1 的可靠信號(hào)概念,以及所有相關(guān)的函數(shù)。
    在此基礎(chǔ)上提供了 about、system 和 sleep 函數(shù)的 POSIX.1實(shí)現(xiàn)。
    最后以觀察分析作業(yè)控制信號(hào)以及信號(hào)名和信號(hào)編號(hào)之間的轉(zhuǎn)換結(jié)束。

    第 11 章-線程
    1、引言
    本章了解如何使用多個(gè)控制線程( 簡(jiǎn)單說就是線程 )在單進(jìn)程中執(zhí)行多個(gè)任務(wù)。一個(gè)進(jìn)程中的所有線程都可以訪問該進(jìn)程的組成部件,如文件描述符和內(nèi)存。
    最后本章將討論目前可用的同步機(jī)制,防止多個(gè)線程在共享資源時(shí)出現(xiàn)不一致的問題。
    有時(shí),也可以將應(yīng)用程序設(shè)計(jì)成使用多線程的(11章),從而避免使用非阻塞 I/O(14章)。
    2、線程概念
    典型的 UNIX 進(jìn)程可以看成只有一個(gè)控制線程:一個(gè)進(jìn)程在某一時(shí)刻只能做一件事情。有了多個(gè)控制線程以后,在程序設(shè)計(jì)時(shí)就可以把進(jìn)程設(shè)計(jì)成在某一時(shí)刻能夠不止做一件事,每個(gè)線程處理各自獨(dú)立的任務(wù)。
    每個(gè)線程都包含有表示執(zhí)行環(huán)境所必須的信息,其中包括進(jìn)程中標(biāo)識(shí)線程的 線程ID、一組寄存器值、棧、調(diào)度優(yōu)先級(jí)和策略、信號(hào)屏蔽字、 errno變量(1.7節(jié))以及線程私有數(shù)據(jù)(12.6節(jié))。
    一個(gè)進(jìn)程的所有信息對(duì)該進(jìn)程的所有線程都是共享的,包括可執(zhí)行程序的代碼、程序的全局內(nèi)存和堆內(nèi)存、棧以及文件描述符。
    3、進(jìn)程標(biāo)識(shí)
    就像每個(gè)進(jìn)程有一個(gè)進(jìn)程 ID 一樣,每個(gè)線程也有一個(gè)線程 ID。進(jìn)程 ID 在整個(gè)系統(tǒng)中是唯一的,但 線程 ID 不同,線程 ID 只有在它所屬的進(jìn)程上下文中才有意義。
    線程 ID 是用 pthread_t數(shù)據(jù)類型來表示的。 用結(jié)構(gòu)表示 pthread_t 數(shù)據(jù)類型的后果是不能用一種可以只的方式打印該數(shù)據(jù)類型的值。在程序調(diào)試過程中打印線程 ID 有時(shí)是非常有用的。
    線程可以通過調(diào)用 pthread_self函數(shù)獲得自身的線程 ID。
    pthread_self函數(shù)可以與 pthread_equal 函數(shù)一起使用。例如,主線程可能把工作任務(wù)放在一個(gè)隊(duì)列中,用線程 ID 來控制每個(gè)工作線程處理哪些作業(yè)。
    4、 線程創(chuàng)建
    在傳統(tǒng) UNIX 進(jìn)程模式中,每個(gè)進(jìn)程只有一個(gè)控制線程。
    新增的線程可以通過調(diào)用 pthread_create 函數(shù)創(chuàng)建(注,它不是系統(tǒng)默認(rèn)的庫(kù),需要在編譯的時(shí)候加上 -lpthread )。
    線程創(chuàng)建時(shí)并不能保證哪個(gè)線程會(huì)先運(yùn)行:是新創(chuàng)建的線程,還是調(diào)用線程。
    5、進(jìn)程終止
    如果進(jìn)程中的任意線程調(diào)用了 exit、 _Exit 或者 _exit,那么整個(gè)進(jìn)程就會(huì)終止。與此相類似,如果默認(rèn)的動(dòng)作是終止進(jìn)程,那么,發(fā)送到線程的信息就會(huì)終止整個(gè)進(jìn)程。
    單個(gè)線程可以通過 3 種方式退出,因此可以在不終止整個(gè)進(jìn)程的情況下,停止它的控制流:
    ?
    ?
    ? 線程調(diào)用 pthread_exit
    進(jìn)程中的其它線程也可以通過調(diào)用 函數(shù) pthread_join 訪問到其它線程指針。 pthread_join 函數(shù)可以等待指定的線程終止,但并不獲取線程的終止?fàn)顟B(tài)。
    當(dāng)一個(gè)線程通過調(diào)用 函數(shù)pthread_exit 退出或者簡(jiǎn)單地從啟動(dòng)歷程中返回時(shí),進(jìn)程中的其它線程可以通過調(diào)用 pthread_join 函數(shù)獲得該線程的退出狀態(tài)。
    線程可以通過調(diào)用 pthread_cancel 函數(shù)來請(qǐng)求取消同一進(jìn)程中的其它線程?!咀ⅰ吭摵瘮?shù)僅僅是提出請(qǐng)求。
    線程可以安排它退出時(shí)需要調(diào)用的函數(shù),這與進(jìn)程在退出時(shí)可以用 atexit函數(shù) 安排退出是類似的。這樣的函數(shù)稱為 線程清理處理程序( thread cleanup handler )。一個(gè)線程可以建立多個(gè)清理處理程序。
    6、線程同步
    當(dāng)多個(gè)控制線程共享相同的內(nèi)存時(shí),需要確保每個(gè)線程看到一致的數(shù)據(jù)視圖。
    當(dāng)一個(gè)線程可以修改的變量,其它線程也可以讀取或者修改的時(shí)候,我們就需要對(duì)這些線程進(jìn)行同步,確保它們?cè)谠L問變量的存儲(chǔ)內(nèi)容時(shí)不會(huì)訪問到無效的值。
    在變量修改時(shí)間多于一個(gè)存儲(chǔ)器訪問周期的處理器結(jié)構(gòu)中,當(dāng)存儲(chǔ)器讀與存儲(chǔ)器寫這兩個(gè)周期交叉時(shí),這種不一致就會(huì)出現(xiàn)。
    為了解決這個(gè)問題,線程不得不使用 鎖 ,同一時(shí)間只允許一個(gè)線程訪問該變量。
    兩個(gè)或多個(gè)線程視圖在同一時(shí)間修改同一變量時(shí),也需要進(jìn)行同步。考慮變量增量操作的情況,增量操作通常分解為以下 3 步:
    1.
    2. 。
    3. 。
    11.6.1- 互斥量
    可以使用 pthread 的互斥忌口來保護(hù)數(shù)據(jù),確保同一時(shí)間只有一個(gè)線程訪問數(shù)據(jù)。
    互斥量( mutex )從本質(zhì)上說是一把鎖,在訪問共享資源前對(duì)互斥量進(jìn)行 設(shè)置(加鎖),在訪問完成之后釋放(解鎖)互斥量。(通過休眠使進(jìn)程阻塞)
    互斥變量是用 pthread_mutex_t 數(shù)據(jù)類型表示的。在使用互斥變量以前,必須首先對(duì)它進(jìn)行初始化。
    11.6.2- 避免死鎖
    ?般情況下,如果同?個(gè)線程先后兩次調(diào)?lock,在第?次調(diào)?時(shí),由于鎖已經(jīng)被占?,該線程會(huì)掛起等待別的線程釋放鎖,然?鎖正是被??占?著的,該線程又被掛起?沒有機(jī)會(huì)釋放鎖,因此 就永遠(yuǎn)處于掛起等待狀態(tài)了,這叫做死鎖(Deadlock)。
    另一種情況:線程A獲 得了鎖1,線程B獲得了鎖2,這時(shí)線程A調(diào)?lock試圖獲得鎖2,結(jié)果是需要掛起等待線程B釋放 鎖2,?這時(shí)線程B也調(diào)?lock試圖獲得鎖1,結(jié)果是需要掛起等待線程A釋放鎖1,于是線程A和B都 永遠(yuǎn)處于掛起狀態(tài)了。
    有時(shí)候,應(yīng)用程序的結(jié)構(gòu)使得對(duì)互斥量進(jìn)行排序是很困難的。如果涉及了太多的鎖和數(shù)據(jù)結(jié)構(gòu),可用的函數(shù)并不能把它轉(zhuǎn)換成簡(jiǎn)單的層次,那么就需要采用另外到底方法。
    在這匯總情況下,可以先釋放占有的鎖,然后過一點(diǎn)時(shí)間再試。這種情況可以使用 pthread_mutex_trylock接口 避免死鎖。
    11.6.3- 函數(shù) pthread_mutex_timelock
    當(dāng)線程試圖獲取一個(gè)已加鎖的互斥量時(shí), pthread_mutex_timelock互斥量 原語(yǔ)允許綁定線程阻塞時(shí)間。 該接口和 pthread_mutex_trylock接口 是基本等價(jià)的,但是在達(dá)到超時(shí)時(shí)間值時(shí), pthread_mutex_timelock 不會(huì)對(duì)互斥量進(jìn)行加鎖,而是返回錯(cuò)誤碼 ETIMEDOUT。
    11.6.4- 讀寫鎖
    讀寫鎖( reader-write lock )與互斥量類似,不過讀寫鎖允許更高的并行性。
    讀寫鎖非常適合于對(duì)數(shù)據(jù)結(jié)構(gòu)讀的次數(shù)遠(yuǎn)大于寫的情況。
    讀寫鎖也叫共享互斥鎖( shared-exclusive lock )。當(dāng)讀寫鎖是讀模式鎖定時(shí),就可以說城市共享模式鎖住的。當(dāng)它是寫模式鎖住的時(shí)候,就可以說成是以互斥鎖模式鎖定的。
    讀寫鎖可以有 3 種狀態(tài):
    ? 讀模式下加鎖狀態(tài);
    ? 寫模式下加鎖狀態(tài);
    ? 不加鎖狀態(tài)。
    一次只有一個(gè)線程可以占有寫模式的讀寫鎖,但是多個(gè)線程可以同時(shí)占有讀模式的讀寫鎖。
    11.6.5- 帶有超時(shí)的讀寫鎖
    帶有超時(shí)的讀寫鎖加鎖函數(shù)可以使應(yīng)用程序在獲取讀寫鎖時(shí)避免陷入永久阻塞狀態(tài)。
    這兩個(gè)函數(shù)分別是: pthread_rwlock_timedrdlock 和 pthread_rwlock_timedwelock。
    11.6.6- 條件變量
    條件變量是線程可用的另一種同步機(jī)制。條件變量給多個(gè)線程提供了一個(gè)會(huì)和的場(chǎng)所。
    條件變量與互斥量一起使用時(shí),允許線程以無競(jìng)爭(zhēng)的方式等待待定的條件發(fā)生。
    在使用條件變量之前,必須先對(duì)它進(jìn)行初始化。由 pthread_cond_t 數(shù)據(jù)類型表示的條件變量可以用兩種方式進(jìn)行初始化。 在釋放條件變量底層的內(nèi)存空間之前,可以使用 pthread_cond_destroy 函數(shù)對(duì)條件進(jìn)行反初始化( deinitialize )。
    11.6.7- 自旋鎖
    自旋鎖與互斥量基本類似,但它不是通過休眠使進(jìn)程阻塞,而是在獲取鎖之前一直處于忙等(自旋)阻塞狀態(tài)。
    自旋鎖可用于以下情況:鎖被持有的時(shí)間短,而且線程并不希望在重新調(diào)度上花費(fèi)太多成本。
    只有一個(gè)屬性是自旋鎖所特有的:那就是 進(jìn)程共享屬性 支持線程進(jìn)程共享同步。
    當(dāng)自旋鎖用在非搶占式內(nèi)核中時(shí)是非常有用的:除了提供互斥機(jī)制以外,它們會(huì)阻塞終端,這樣中斷處理程序就不會(huì)讓系統(tǒng)陷入死鎖狀態(tài),因?yàn)樗枰@取已被加鎖的自旋鎖( 把中斷想成是另一種搶占 )。
    11.6.8- 屏障
    屏障( barrier )是用戶協(xié)調(diào)多個(gè)線程并行工作的同步機(jī)制。屏障允許每個(gè)線程等待,知道所有的合作線程都到達(dá)某一點(diǎn),然后從該點(diǎn)繼續(xù)執(zhí)行。
    屏障對(duì)象的概念很廣,它們?cè)试S任意數(shù)量的線程等待,知道所有的線程完成處理工作,而線程不需要退出。所有線程達(dá)到屏障后可以接著工作。
    可以使用 pthread_barrier_init 函數(shù) 對(duì)屏障進(jìn)行初始化。
    一旦達(dá)到屏障計(jì)數(shù)值,而且線程處于非阻塞狀態(tài),屏障就可以被重用。
    11.7 小結(jié)
    本章介紹了線程的概念,主要討論了 5 個(gè)基本的同步機(jī)制:

  • 互斥量;
  • 讀寫鎖;
  • 條件變量;
  • 自旋鎖;
  • 屏障
  • 第 12 章- 線程控制
    1、引言
    本章將介紹控制線程行為方面的內(nèi)容:
    ? 線程屬性;
    ? 同步原語(yǔ)屬性;
    ? 同一進(jìn)程中的多個(gè)線程之間如何保持?jǐn)?shù)據(jù)的私有性;
    ? 基于進(jìn)程系統(tǒng)調(diào)用如何與線程進(jìn)行交互。
    2、線程限制
    線程限制的使用時(shí)為了增強(qiáng)應(yīng)用程序在不同的操作系統(tǒng)實(shí)現(xiàn)之間的可移植性。
    3、線程屬性
    ptherd接口允許我們通過設(shè)置每個(gè)對(duì)象關(guān)聯(lián)的不同屬性來細(xì)調(diào)線程和同步對(duì)象的行為。通常,管理這些屬性的函數(shù)都遵循相同的模式:

  • 每個(gè)對(duì)象與它自己類型的屬性對(duì)象進(jìn)行關(guān)聯(lián)(線程與線程屬性關(guān)聯(lián),互斥量與互斥量屬性關(guān)聯(lián)…)。
  • 有一個(gè)初始化函數(shù),把屬性設(shè)置為默認(rèn)值。
  • 還有一個(gè)銷毀屬性對(duì)象的函數(shù)。
  • 每個(gè)屬性都有一個(gè)從屬性對(duì)象中獲取屬性值的函數(shù)。
  • 每個(gè)屬性都有一個(gè)設(shè)置屬性值的函數(shù)。
    4、同步屬性
    就像線程具有屬性一樣,線程同步對(duì)象也有屬性。
    在 11.6.7中介紹了 自旋鎖的屬性: 進(jìn)程共享屬性。接下來介紹另外四種同步機(jī)制的屬性。
    在談到屬性時(shí)一般談及:
    12.4.1- 互斥量屬性
    在進(jìn)程中,多個(gè)線程可以訪問同一個(gè)同步對(duì)象?;コ饬坑?3 個(gè)屬性。
    進(jìn)程共享互斥量屬性需設(shè)置為 PTHREAD_PROCESS_PRIVATE。如果進(jìn)程共享互斥量屬性社會(huì)為 PTHREAD_PROCESS_SHARED,從多個(gè)進(jìn)程彼此之間共享的內(nèi)存數(shù)據(jù)塊中分配的互斥量就可以用于這些進(jìn)程的同步。
    互斥量健壯屬性 與在多個(gè)進(jìn)程間共享的互斥量有關(guān)。 這意味著,當(dāng)持有互斥量的進(jìn)程終止時(shí),需要解決不吃量狀態(tài)恢復(fù)的問題。這種情況發(fā)生時(shí),互斥量處于鎖定狀態(tài),恢復(fù)起來很困難。
    類型互斥量屬性 控制著互斥量的鎖定特性。
    12.4.2- 讀寫鎖屬性
    讀寫鎖支持的唯一屬性是 進(jìn)程共享屬性。
    它與互斥量的 進(jìn)程共享屬性 是相同的。就像互斥量的進(jìn)程共享屬性一樣,有一堆函數(shù)用于讀取和設(shè)置讀寫鎖的進(jìn)程共享屬性。
    12.4.3- 條件變量屬性
    條件變量有 2 個(gè)屬性: 進(jìn)程共享屬性 和 時(shí)鐘屬性。與其它的屬性對(duì)象一樣,條件變量屬性也有一對(duì)函數(shù)用于初始化和反初始化條件變量屬性。
    進(jìn)程共享屬性: 它控制著條件變量是可以被單進(jìn)程的多個(gè)線程使用,還是可以被多進(jìn)程的線程使用。
    時(shí)鐘屬性: 控制計(jì)算 pthread_cond_timedwait 函數(shù)的超時(shí)參數(shù) (tsptr)時(shí)采用的是哪個(gè)時(shí)鐘。
    12.4.4- 屏障屬性
    屏障屬性 目前只有 進(jìn)程共享屬性:它控制著屏障是可以被多進(jìn)程的線程使用,還是只能被初始化屏障的進(jìn)程內(nèi)的多線程使用。
    12.5、 重入
    如果一個(gè)函數(shù)在相同的時(shí)間點(diǎn)可以被多個(gè)線程安全地調(diào)用,就稱該函數(shù)是 線程安全 的。
    如果一個(gè)函數(shù)對(duì)多個(gè)線程來說是可 重入 的,就說這個(gè)函數(shù)就是線程安全的。但這并不能說明 對(duì)信號(hào)處理程序來說該函數(shù)也是可重入的。如果函數(shù)對(duì)異步信號(hào)處理程序的重入是安全的,那么就可以說函數(shù)是 異步信號(hào)安全 的。
    12.6、 線程特定數(shù)據(jù)
    線程特定數(shù)據(jù)( thread-specific data ),也稱為 線程私有數(shù)據(jù)( thread-private data )是存儲(chǔ)和查詢某個(gè)特定線程相關(guān)數(shù)據(jù)的一種機(jī)制。 因?yàn)槲覀兿M總€(gè)線程可以訪問它自己?jiǎn)为?dú)的數(shù)據(jù)副本,而不需要擔(dān)心與其它線程的同步訪問問題。
    優(yōu)點(diǎn):
  • 有時(shí)候需要維護(hù)基于每線程( per-thread )的數(shù)據(jù)。
  • 它提供了讓基于進(jìn)程的接口適應(yīng)多線程環(huán)境的機(jī)制。
    我們知道,一個(gè)進(jìn)程中的所有線程都可以訪問這個(gè)進(jìn)程的整個(gè)地址空間。 除了使用寄存器以外,一個(gè)線程沒有辦法阻止另一個(gè)線程訪問它的數(shù)據(jù)。線程特定數(shù)據(jù)也不例外。
    雖然底層的實(shí)現(xiàn)部分并不能阻止這種訪問能力,但管理線程特定數(shù)據(jù)的函數(shù)可以提高線程間的數(shù)據(jù)獨(dú)立性,使得線程不太容訪問到其它線程的線程特定數(shù)據(jù)。
    12.7、 取消選項(xiàng)
    可取消狀態(tài) 和 可取消類型 這兩個(gè)屬性影響著線程在響應(yīng) pthread_cancel 函數(shù)調(diào)用時(shí)所 呈現(xiàn)的行為。
    可取消狀態(tài)屬性 可以是 PTHREAD_CANCEL_ENABLE, 也可以是 PTHREAD_CANCEL_DISABLE。線程可以通過調(diào)用 pthread_setcancelstate 修改它的 可取消狀態(tài)。
    在默認(rèn)情況下,線程在取消請(qǐng)求發(fā)出以后還是繼續(xù)運(yùn)行,直到線程到達(dá)某個(gè)取消點(diǎn)。 取消點(diǎn)是線程檢查它是都被取消的一個(gè)位置,如果取消了,則按照要求行事。
    線程啟動(dòng)時(shí)默認(rèn)的 可取消狀態(tài)是 PTHREAD_CANCEL_ENABLE。
    異步取消 與 推遲取消不同,因?yàn)槭褂卯惒饺∠麜r(shí),線程可以在任意時(shí)間撤銷,不是非得遇到取消點(diǎn)才能被取消。
    12.8、 線程 和 信號(hào)
    每個(gè)線程都有自己的信號(hào)屏蔽字,但是信號(hào)的處理是進(jìn)程中所有線程共享的。
    12.9、 線程 和 fork
    當(dāng)線程調(diào)用 fork 時(shí),就為子進(jìn)程創(chuàng)建了整個(gè)進(jìn)程地址空間的副本。
    在多線程的進(jìn)程中沒了避免不一致狀態(tài)的問題,在 fork 返回和子進(jìn)程調(diào)用其中一個(gè) exec 函數(shù)之間,子進(jìn)程只能調(diào)用異步信號(hào)安全的函數(shù)。這就限制了在調(diào)用 exec 之前子進(jìn)程能做什么,但不涉及子進(jìn)程中鎖狀態(tài)的問題。
    用 pthread_atfork 函數(shù)最多可以安裝 3 個(gè)幫助清理鎖的函數(shù)。
    ? prepare fork 處理程序由父進(jìn)程在 fork 創(chuàng)建子進(jìn)程前調(diào)用。這個(gè) fork 處理程序的任務(wù)是獲取父進(jìn)程定義的所有鎖。
    ? parent fork處理程序是在 fork創(chuàng)建子進(jìn)程以后、返回之前在父進(jìn)程上下文中調(diào)用的。
    ? child fork 處理程序在 fork 返回之前在子進(jìn)程上下文中調(diào)用。
    12.10、 線程 和 I/0
    很多函數(shù)( eg. 3.11節(jié)中提及的 pread 、 pwrite )在多線程環(huán)境下也是非常有用的,因?yàn)檫M(jìn)程中的所有線程共享相同的文件描述符。
    12.11、 小結(jié)
    本章中了解了:
    ? 如何調(diào)整線程和它們的同步原語(yǔ)
    ? 討論了線程的可重入性
    ? 還學(xué)習(xí)了線程如何與其它面向進(jìn)程的系統(tǒng)調(diào)用進(jìn)行交互。
  • 第 13 章- 守護(hù)進(jìn)程
    1、引言
    守護(hù)進(jìn)程常常用作服務(wù)器進(jìn)程。
    守護(hù)進(jìn)程( daemon )是生存期長(zhǎng)的一種進(jìn)程。 它們常常在系統(tǒng)引導(dǎo)裝入時(shí)啟動(dòng),僅在系統(tǒng)關(guān)閉時(shí)才終止。因?yàn)樗鼈儧]有控制終端,所以說它們是在后臺(tái)運(yùn)行的。
    2、守護(hù)進(jìn)程的特征
    大多數(shù)守護(hù)進(jìn)程都以超級(jí)用戶( root )特權(quán)運(yùn)行。所有的守護(hù)進(jìn)程都沒有控制終端,其終端名設(shè)置為問號(hào)。大多數(shù)用戶層守護(hù)進(jìn)程都是進(jìn)程組的組長(zhǎng)進(jìn)程以及會(huì)話的首進(jìn)程,而且是這些進(jìn)程組和會(huì)話中的唯一進(jìn)程。
    3、編程規(guī)則
    在編寫守護(hù)進(jìn)程程序時(shí)需要遵循一些基本規(guī)則,以防止產(chǎn)生不必要的交互作用。
    ? 首先要做的是調(diào)用 umask 將文件模式創(chuàng)建屏蔽字設(shè)置為一個(gè)已知值(通常是0);
    ? 調(diào)用 fork,然后使父進(jìn)程 exit;
    ? 調(diào)用 setsid 創(chuàng)建一個(gè)新會(huì)話;
    ? 將當(dāng)前工作目錄更改為根目錄;
    ? 關(guān)閉不再需要的文件描述符;
    ? 某些守護(hù)進(jìn)程打開 /dev/null 使其具有文件描述符 0、1 和 2 ,這樣,任何一個(gè)試圖讀標(biāo)準(zhǔn)輸入、寫標(biāo)準(zhǔn)輸出或標(biāo)準(zhǔn)錯(cuò)誤的庫(kù)歷程都不會(huì)產(chǎn)生任何效果。
    4、出錯(cuò)記錄
    守護(hù)進(jìn)程存在的一個(gè)問題是如何處理出錯(cuò)消息。 因?yàn)樗揪筒粦?yīng)該有控制終端,所以不能只是簡(jiǎn)單地寫到標(biāo)準(zhǔn)錯(cuò)誤上。
    有以下 3 種產(chǎn)生日志消息的方法:
    ? 內(nèi)核例程可以調(diào)用 log 函數(shù);
    ? 大多數(shù)用戶進(jìn)程(守護(hù)進(jìn)程 )調(diào)用 syslog(3)函數(shù)來產(chǎn)生日志消息。
    ? 無論一個(gè)用戶進(jìn)程是在此主機(jī)上,還是在通過 TCP/IP網(wǎng)絡(luò)連接到此主機(jī)的其它主機(jī)上,都可以將日志消息發(fā)向 UDP端口 514。
    5、單實(shí)例守護(hù)進(jìn)程
    為了正常運(yùn)作,某些守護(hù)進(jìn)程會(huì)實(shí)現(xiàn)為,在任一時(shí)刻只運(yùn)行該守護(hù)進(jìn)程的一個(gè)副本。
    如果守護(hù)進(jìn)程需要訪問一個(gè)設(shè)備,而該設(shè)備驅(qū)動(dòng)程序有時(shí)會(huì)阻止想要多次打開 /dev 目錄下相應(yīng)設(shè)備節(jié)點(diǎn)的嘗試。這就限制了在一個(gè)時(shí)刻只能運(yùn)行守護(hù)進(jìn)程的一個(gè)副本。
    文件 和 記錄鎖機(jī)制為一種方法提供了基礎(chǔ),該方法保證一個(gè)守護(hù)進(jìn)程只有一個(gè)副本在運(yùn)行。
    文件和記錄鎖提供了一種方便的互斥機(jī)制。
    守護(hù)進(jìn)程的每個(gè)副本都將試圖創(chuàng)建一個(gè)文件,并將其進(jìn)程 ID 寫到該文件中。
    6、守護(hù)進(jìn)程的慣例
    在 UNIX 系統(tǒng)中,守護(hù)進(jìn)程遵循下列通用慣例:
    ? 若守護(hù)進(jìn)程使用鎖文件,那么該文件通常存儲(chǔ)在 /var/run 目錄中;
    ? 若守護(hù)進(jìn)程支持配置選項(xiàng),那么配置文件通常存放在 /etc 目錄中;
    ? 守護(hù)進(jìn)程可用命令行啟動(dòng),但通常它們是由系統(tǒng)初始化腳本之一( /etc/rc* 或 /etc/init.d/* )啟動(dòng)的;
    ? 若一個(gè)守護(hù)進(jìn)程有一個(gè)配置文件,那么當(dāng)該守護(hù)進(jìn)程啟動(dòng)時(shí)會(huì)讀該文件,但在此之后一般就不會(huì)再查看它。
    7、客戶進(jìn)程-服務(wù)器進(jìn)程 模型
    守護(hù)進(jìn)程常常用作服務(wù)器進(jìn)程。
    一般而言, 服務(wù)器進(jìn)程 等待 客戶進(jìn)程 與其通信,提出某種類型的服務(wù)要求。有的通信是單向的,有的通信是雙向的。
    8、小結(jié)
    在大多數(shù) UNIX 系統(tǒng)中,守護(hù)進(jìn)程是一直運(yùn)行的。
    為了初始化我們自己的進(jìn)程,使之作為守護(hù)進(jìn)程運(yùn)行,需要一些審慎的思索并理解第 9 章 說明的進(jìn)程之間的關(guān)系。
    本章還討論了守護(hù)進(jìn)程記錄 出錯(cuò)消息 的幾種方法。

    第 14 章- 高級(jí) I/O
    1、引言
    本章會(huì)講到:
    ? 非阻塞 I/O;
    ? 記錄鎖;
    ? I/O多路轉(zhuǎn)換( select 和 poll 函數(shù) );
    ? 異步 I/O;
    ? readv 和 writev 函數(shù);
    ? 存儲(chǔ)映射 I/O( mmap );
    2、非阻塞 I/O
    10.5節(jié)中曾將系統(tǒng)調(diào)用分成兩類:“低速”系統(tǒng)調(diào)用 和 其它。 低速系統(tǒng)調(diào)用是可能會(huì)使進(jìn)程永遠(yuǎn)阻塞的一類系統(tǒng)調(diào)用。
    非阻塞 I/O 使我們可以發(fā)出 open、read 和 write這樣的 I/O 操作,并使這些操作不會(huì)永遠(yuǎn)阻塞。
    有時(shí),也可以將應(yīng)用程序設(shè)計(jì)成使用多線程的(11章),從而避免使用非阻塞 I/O。如若我們能在其它線程中繼續(xù)進(jìn)行,則可以允許單個(gè)線程在 I/O 調(diào)用中阻塞。
    3、記錄鎖
    商用 UNIX 系統(tǒng)提供了記錄鎖機(jī)制。
    記錄鎖( record locking )的功能是:當(dāng)?shù)谝粋€(gè)進(jìn)程正在讀或修改文件的某個(gè)部分時(shí),使用記錄鎖可以阻止其它進(jìn)程修改同一文件區(qū)。(“記錄”這個(gè)詞并不準(zhǔn)確,因?yàn)?UNIX 系統(tǒng)內(nèi)核沒有使用文件記錄這種說法。 一個(gè)更合適的術(shù)語(yǔ)是 “字節(jié)范圍鎖”( byte-range locking ),因?yàn)樗i定的只是文件中的一個(gè)區(qū)域 )。
    14.3.1- 歷史
    早起 UNIX 是沒有 記錄鎖的。
    14.3.2- fcnt1 記錄鎖
    主要分為兩種類型的鎖: 共享讀鎖( l_type 為 L_RDLCK )和獨(dú)占性寫鎖( L_WRLCK )。基本規(guī)則是:任意多個(gè)進(jìn)程在一個(gè)給定的字節(jié)上可以有一把共享的讀鎖,但是在一個(gè)給定字節(jié)上只能有一個(gè)進(jìn)程有一把獨(dú)占寫鎖。
    14.3.3- 鎖的隱含繼承和釋放
    關(guān)于記錄鎖的自動(dòng)繼承和釋放有 3 條規(guī)則:
    ? 鎖與進(jìn)程和文件兩者相關(guān)聯(lián);
    ? 由 fork 產(chǎn)生的子進(jìn)程不繼承父進(jìn)程所設(shè)置的鎖;
    ? 在執(zhí)行 exec后,新程序可以繼承原執(zhí)行程序的鎖。
    14.3.4- FreeBSD 實(shí)現(xiàn)
    14.3.5- 在文件尾端加鎖
    14.3.6- 建議性鎖 和 強(qiáng)制性鎖
    考慮數(shù)據(jù)庫(kù)訪問例程庫(kù)。
    如果該庫(kù)中所有函數(shù)都以一致的方法處理記錄鎖,則稱使用這些函數(shù)訪問數(shù)據(jù)庫(kù)的進(jìn)程集為 合作進(jìn)程( cooperating process )。如果這些函數(shù)是唯一地用來訪問數(shù)據(jù)庫(kù)的函數(shù),那么它們使用建議性鎖是可行的。但是建議性鎖并不能阻止對(duì)數(shù)據(jù)庫(kù)文件有寫權(quán)限的任何其它進(jìn)程寫這個(gè)數(shù)據(jù)庫(kù)文件。
    4、 I/O 多路轉(zhuǎn)接
    當(dāng)從一個(gè)描述符讀,然后又寫到另一個(gè)描述符時(shí),可以在下列形式的循環(huán)中使用阻塞 I/O: … 這種形式的阻塞 I/O 到處可見。但是如果必須從兩個(gè)描述符讀,又將如何呢?
    ? 法1- 將一個(gè)進(jìn)程變成兩個(gè)進(jìn)程(用 fork),每個(gè)進(jìn)程處理一條數(shù)據(jù)通路。如果使用兩個(gè)進(jìn)程,則可使每個(gè)進(jìn)程都執(zhí)行阻塞 read。
    ? 法2- 我們可以不使用 兩個(gè)進(jìn)程,而是用一個(gè)進(jìn)程中的兩個(gè)線程。 雖然避免了終止的復(fù)雜性,但卻要求處理兩個(gè)線程之間的同步。
    ? 法3- 仍舊使用一個(gè)進(jìn)程執(zhí)行該程序,但使用非阻塞 I/O讀取數(shù)據(jù)。
    ? 法4- 還有一種技術(shù)成為 異步I/O( asynchronous I/O )。
    ? 法5- 一種比較好的技術(shù)是使用 I/O多路轉(zhuǎn)接( I/O multiplexing )。為了使用這種技術(shù),先構(gòu)造一張我們感興趣的描述符(通常不止一個(gè))的列表,然后調(diào)用一個(gè)函數(shù),知道這些描述符中的一個(gè)已準(zhǔn)備好進(jìn)行 I/O時(shí),該函數(shù)才返回。
    14.4.1- 函數(shù) select 和 pselect
    select函數(shù)使我們可以執(zhí)行 I/O多路轉(zhuǎn)接。
    pselect 是 select函數(shù)的變體。
    14.4.2- 函數(shù) poll
    poll 函數(shù)類似于 select,但是程序員接口有所不同。 雖然 poll 函數(shù)是 System V 引入進(jìn)來支持 STREAMS 子系統(tǒng)的,但是 poll函數(shù)可用于任何類型的文件描述符。
    5、異步 I/O
    14.5.1- System V 異步 I/O
    14.5.2- BSD 異步 I/O
    14.5.3- POSIX 異步 I/O
    6、 函數(shù) readv 和 writev
    readv 和 writev 函數(shù)用于在一次函數(shù)調(diào)用中讀、寫多個(gè)非連續(xù)緩沖區(qū)。有時(shí)也將這兩個(gè)函數(shù)稱為 散步讀( scatter read )和聚集寫( gather write )
    7、函數(shù) readn 和 writen
    函數(shù) readn 和 writen 的功能分別是讀、寫指定的 N 字節(jié)數(shù)據(jù),并處理返回值可能小于要求值的情況。這兩個(gè)函數(shù)只是按需多次調(diào)用 read 和 wtire直至讀、寫了 N 字節(jié)數(shù)據(jù)。
    8、存儲(chǔ)映射 I/O
    存儲(chǔ)映射 I/O( memory-mapped I/O )能將一個(gè)磁盤文件映射到存儲(chǔ)空間中的一個(gè)緩沖區(qū)上,于是,當(dāng)從緩沖區(qū)取數(shù)據(jù)時(shí),就相當(dāng)于讀文件中的相應(yīng)字節(jié)。與此類似,將數(shù)據(jù)存入緩沖區(qū)時(shí),相應(yīng)字節(jié)就自動(dòng)寫入文件。這樣就可以在不使用 read 和 write 的情況下執(zhí)行 I/O。
    9、小結(jié)
    本章描述了很多高級(jí) I/O 功能:
    ? 非阻塞 I/O——發(fā)一個(gè) I/O操作,不使其阻塞;
    ? 記錄鎖
    ? I/O多路轉(zhuǎn)接—— select 和 poll 函數(shù)
    ? readv 和 writev 函數(shù)
    ? 存儲(chǔ)映射 I/O(mmap)

    第 15 章- 進(jìn)程間通信
    1、引言
    進(jìn)程間通信( InterProcess Communication, IPC )。
    本章討論經(jīng)典的 IPC: 管道(pipe)、FIFO、消息隊(duì)列、信號(hào)量、共享存儲(chǔ)。
    2、管道
    管道是 UNIX 系統(tǒng) IPC 的最古老的形式,一般是半雙工的(即數(shù)據(jù)只能在一個(gè)方向時(shí)流動(dòng)),現(xiàn)在某些系統(tǒng)也提供全雙工管道。
    每當(dāng)在管道中鍵入一個(gè)命令序列, 讓 shell 執(zhí)行時(shí), shell 都會(huì)為每一條命令單獨(dú)創(chuàng)建一個(gè)進(jìn)程,然后用管道將前一條命令進(jìn)程的標(biāo)準(zhǔn)輸出與后一條命令的標(biāo)準(zhǔn)輸入相連接。
    管道通常用 pipe 函數(shù)創(chuàng)建。
    fstat 函數(shù)對(duì)管道的每一端都返回一個(gè) FIFO(也稱命名管道) 類型的文件描述符。
    3、函數(shù) popen 和 pclose
    常見的操作是創(chuàng)建一個(gè)連接到另一個(gè)進(jìn)程的管道,然后讀其輸出或向其輸入端發(fā)送數(shù)據(jù)。
    為此,標(biāo)準(zhǔn) I/O 庫(kù)提供了兩個(gè)函數(shù) popen 和 pclose : 創(chuàng)建一個(gè)管道, fork 一個(gè)子進(jìn)程,關(guān)閉未使用的管道端,執(zhí)行一個(gè) shell 運(yùn)行命令,然后等待命令終止。
    4、協(xié)同進(jìn)程
    UNIX 系統(tǒng)過濾程序從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù),向標(biāo)準(zhǔn)輸出寫數(shù)據(jù)。幾個(gè)過濾程序通常在 shell 管道中線性連接。當(dāng)一個(gè)過濾程序即產(chǎn)生某個(gè)過濾程序的輸入,又讀取該過濾程序的輸出時(shí),它就變成了 協(xié)同進(jìn)程( coprocess )。
    協(xié)同進(jìn)程通常在 shell 的后臺(tái)運(yùn)行,其標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出通過管道連接到另一個(gè)程序。
    popen 只提供連接到另一個(gè)進(jìn)程的標(biāo)準(zhǔn)輸入或標(biāo)準(zhǔn)輸出的一個(gè)單向管道;
    而協(xié)同進(jìn)程則有連接到另一個(gè)進(jìn)程的兩個(gè)單項(xiàng)管道:一個(gè)接到其標(biāo)準(zhǔn)輸入,另一個(gè)則來自其標(biāo)準(zhǔn)輸出。
    5、FIFO
    FIFO 有時(shí)被稱為 命名管道。
    未命名的管道只能在兩個(gè)相關(guān)的進(jìn)程之間使用,而且這兩個(gè)相關(guān)的進(jìn)程還有有一個(gè)共同的創(chuàng)建了它們的祖先進(jìn)程。
    但是通過 FIFO,可以用于非線性連接,不相關(guān)的進(jìn)程也能交換數(shù)據(jù)!
    FIFO 有以下兩種用途:

  • shell 命令使用 FIFO 將數(shù)據(jù)從一條管道傳送到另一條時(shí),無需創(chuàng)建中間臨時(shí)文件。
    FIFO 可以用于復(fù)制一系列 shell 命令中的輸出流,這就防止了將數(shù)據(jù)寫向中間磁盤文件。
  • 客戶進(jìn)程-服務(wù)器進(jìn)程 應(yīng)用程序中, FIFO 用作匯聚點(diǎn),在客戶進(jìn)程和服務(wù)器進(jìn)程兩者之間傳遞數(shù)據(jù)。
    6、 XSI IPC
    有 3 種稱為 XSI IPC 的 IPC:消息隊(duì)列、信號(hào)量、共享存儲(chǔ)器。
    15.6.1- 標(biāo)識(shí)符和鍵
    每個(gè)內(nèi)核中的 IPC 結(jié)構(gòu)(消息隊(duì)列、信號(hào)量 或 共享存儲(chǔ)段)都用一個(gè)非負(fù)整數(shù)的 標(biāo)識(shí)符( identifier )加以引用。(例如,要向一個(gè)消息隊(duì)列發(fā)送消息或者從一個(gè)消息隊(duì)列取消息,只需要知道其隊(duì)列標(biāo)識(shí)符)。
    為此,每個(gè) IPC 對(duì)象都與一個(gè) 鍵( key )相關(guān)聯(lián),將這個(gè)鍵作為該對(duì)象的外部名。
    15.6.2- 權(quán)限結(jié)構(gòu)
    XSI IPC 為每一個(gè) IPC 結(jié)構(gòu)關(guān)聯(lián)了一個(gè) ipc_perm 結(jié)構(gòu)。該結(jié)構(gòu)規(guī)定了權(quán)限和所有者。
    15.6.3- 結(jié)構(gòu)限制
    所有 3 中形式的 XSI IPC 都有內(nèi)置限制。大多數(shù)限制可以通過重新配置內(nèi)核來改變。
    15.6.4- 優(yōu)點(diǎn)和缺點(diǎn)
    7、消息隊(duì)列
    消息隊(duì)列是消息的鏈接表,存儲(chǔ)在內(nèi)核中,由消息隊(duì)列標(biāo)識(shí)符標(biāo)識(shí)。
    msgget 用于創(chuàng)建一個(gè)新隊(duì)列或打開一個(gè)現(xiàn)有隊(duì)列;
    msgsnd 將新消息添加到隊(duì)列尾端。
    8、 信號(hào)量
    信號(hào)量 與已經(jīng)介紹過的 IPC機(jī)構(gòu)( 管道、FIFO、以及消息隊(duì)列 )不同。它是一個(gè)計(jì)數(shù)器,用于為多個(gè)進(jìn)程提供對(duì)共享數(shù)據(jù)對(duì)象的訪問。
    為了正確地實(shí)現(xiàn)信號(hào)量,信號(hào)量值的測(cè)試及減 1 操作應(yīng)當(dāng)是原子操作。為此,信號(hào)量通常是在內(nèi)核中實(shí)現(xiàn)的。
    常用的信號(hào)量形式被稱為 二元信號(hào)量( binary semaphore )。一般而言,信號(hào)量的初值可以使任意一個(gè)正值,該值表明有多少個(gè)共享資源單位可供共享應(yīng)用。
    9、共享存儲(chǔ)
    共享存儲(chǔ) 允許兩個(gè)或多個(gè)進(jìn)程共享一個(gè)給定的存儲(chǔ)區(qū)。
    因?yàn)閿?shù)據(jù)不需要在客戶進(jìn)程和服務(wù)器進(jìn)程之間復(fù)制,所以這是最快的一種 IPC。
    使用共享村粗時(shí)要掌握的唯一竅門是,在多個(gè)進(jìn)程之間同步訪問一個(gè)給定的存儲(chǔ)區(qū)。
    10、 POSIX 信號(hào)量
    11、 客戶進(jìn)程-服務(wù)器進(jìn)程 屬性
  • 12、小結(jié)
    本章詳細(xì)說明了進(jìn)程間通信的多種形式: 管道、命名管道( FIFO )、通常稱為 XSI IPC 的 3 種形式的 IPC( 消息隊(duì)列、信號(hào)量 和 共享存儲(chǔ) ),以及 POSIX 提供的替代信號(hào)量機(jī)制。
    給出了一下建議:
    ? 要學(xué)會(huì)使用管道 和 FIFO;
    ? 要盡可能避免使用消息隊(duì)列以及信號(hào)量;
    ? 應(yīng)該考慮全雙工管道和記錄鎖;
    ? 共享存儲(chǔ)仍然有它的用途, 雖然通過 mmap 函數(shù)也可能提供通項(xiàng)的功能。

    第 16 章- 網(wǎng)絡(luò) IPC: 套接字
    進(jìn)程間通信( InterProcess Communication, IPC )。
    1、引言
    本章將考察不同計(jì)算機(jī)(通過網(wǎng)絡(luò)相連)上的進(jìn)程相互通信的機(jī)制:網(wǎng)絡(luò)進(jìn)程間通信( network IPC ).
    在本章中,將描述套接字網(wǎng)絡(luò)進(jìn)程間通信接口,進(jìn)程用改接口能夠和其它進(jìn)程通信,無論它們是在同一臺(tái)計(jì)算機(jī)上還是不同的計(jì)算機(jī)上。本章僅是一個(gè)套接字 API 的概述。
    2、 套接字描述符
    套接字是通信端點(diǎn)的抽象。
    套接字描述符在 UNIX 系統(tǒng)中被當(dāng)做是一種文件描述符。
    為創(chuàng)建一個(gè)套接字,調(diào)用 socket 函數(shù)。

    對(duì)于數(shù)據(jù)報(bào)( SOCK_DGRAM )接口,兩個(gè)對(duì)等進(jìn)程之間通信時(shí)不需要邏輯連接。只需要向?qū)Φ冗M(jìn)程所使用的套接字送出一個(gè)報(bào)文。因此 數(shù)據(jù)報(bào)提供了一個(gè)無連接的服務(wù)。
    另一方面,字節(jié)流( SOCK_STREAM )要求在交換數(shù)據(jù)之前,在本地套接字和通信的對(duì)等進(jìn)程的套接字之間建立一個(gè)邏輯連接。

    流控制傳輸協(xié)議( Stream Control Transmission Protocol, SCTP )提供了因特網(wǎng)域上的順序數(shù)據(jù)包服務(wù)。
    調(diào)用 socket 與調(diào)用 open 相類似。在兩種情況下,均可獲得用于 I/O 的文件描述符。當(dāng)不再需要該文件描述符時(shí),調(diào)用 close 來關(guān)閉對(duì)文件或套接字的訪問,并且釋放該描述符以便重新使用。
    套接字通信是雙向的。 可以采用 shutdown 函數(shù)來禁止一個(gè)套接字的 I/O。
    3、尋址
    進(jìn)程標(biāo)識(shí)由兩部分組成:
    ? 計(jì)算機(jī)的網(wǎng)絡(luò)地址;
    ? 計(jì)算機(jī)上用 端口號(hào) 表示的服務(wù)。
    16.3.1- 字節(jié)序
    字節(jié)序 是一個(gè)處理器架構(gòu)特性,用于指示像整數(shù)這樣的大數(shù)據(jù)類型內(nèi)部的字節(jié)如何排序。
    如果處理器架構(gòu)支持 大端( big-endian )字節(jié)序:那么最大字節(jié)地址出現(xiàn)在最低有效字節(jié)( Least Significant Byte, LSB )上。
    小端( little-endian )字節(jié)序:最低有效字節(jié)包含最小字節(jié)地址。
    【注】不管字節(jié)如何排序,自最高有效字節(jié)(Most Significant Byte, MSB)總在左邊,最低有效字節(jié)總是在右邊。
    網(wǎng)絡(luò)協(xié)議指定了字節(jié)序,因此異構(gòu)計(jì)算機(jī)系統(tǒng)能夠交換協(xié)議信息而不會(huì)被字節(jié)序所混淆。 TCP/IP 協(xié)議棧使用大端字節(jié)序。對(duì)于TCP/IP,地址用網(wǎng)絡(luò)字節(jié)序來表示,所以應(yīng)用程序有時(shí)需要在處理器的字節(jié)序與網(wǎng)絡(luò)字節(jié)序之間轉(zhuǎn)換他們。
    16.3.2- 地址格式
    一個(gè)地址標(biāo)識(shí)一個(gè)特定通信域的套接字端點(diǎn),地址格式與這個(gè)特定的通信域相關(guān)。
    16.3.3- 地址查詢
    16.3.4- 將套接字與地址關(guān)聯(lián)
    對(duì)于服務(wù)器,需要給一個(gè)接受客戶端請(qǐng)求的服務(wù)器套接字關(guān)聯(lián)上一個(gè)眾所周知的地址。
    客戶端應(yīng)有一種方法來發(fā)現(xiàn)連接服務(wù)器所需要的地址,最簡(jiǎn)單的方法就是服務(wù)器保留一個(gè)地址并且注冊(cè)在 /etc/services 或者某個(gè)名字服務(wù)中。
    4、建立連接
    如果要處理一個(gè)面向連接的 網(wǎng)絡(luò)服務(wù)( SOCK_STREAM 或 SOCK_SEQPACKET ),那么在開始叫喚數(shù)據(jù)以前,需要在請(qǐng)求服務(wù)的進(jìn)程套接字(客戶端)和提供服務(wù)的進(jìn)程套接字(服務(wù)器)之間建立一個(gè)連接。 使用 connect 函數(shù) 來建立連接。
    5、數(shù)據(jù)傳輸
    既然一個(gè)套接字端點(diǎn)表示為一個(gè)文件描述符,那么只要建立連接,就可以使用 read 和 write來通過套接字通信。
    在套接字描述符上使用 read 和 write 是非常有意義的,因?yàn)檫@意味著可以將套接字描述符傳遞給那些原先為處理本地文件而設(shè)計(jì)的函數(shù)。 而且還可以安排將套接字描述符傳遞給子進(jìn)程,而該子進(jìn)程執(zhí)行的程序并不了解套接字。
    6、套接字選項(xiàng)
    套接字機(jī)制提供了兩個(gè)套接字選項(xiàng)接口來控制套接字行為:
    ? 一個(gè)接口用來設(shè)置選項(xiàng);
    ? 另一個(gè)接口可以查詢選項(xiàng)的狀態(tài)。
    可以獲取 or 設(shè)以下 3 種選項(xiàng):
    ? 通用選項(xiàng),工作在所有套接字類型上;
    ? 在套接字層次管理的選項(xiàng),但是依賴于下層協(xié)議的支持;
    ? 特定于某協(xié)議的選項(xiàng),每個(gè)協(xié)議獨(dú)有的。
    可以使用 setsockopt 函數(shù)來設(shè)置套接字選項(xiàng)。
    7、帶外數(shù)據(jù)
    帶外數(shù)據(jù)( out-of-band data )是一些通信協(xié)議所支持的可選功能,與普通數(shù)據(jù)相比,它允許更好優(yōu)先級(jí)的數(shù)據(jù)傳輸。帶外數(shù)據(jù)先行傳輸,即使傳輸隊(duì)列已經(jīng)有數(shù)據(jù)。
    TCP 支持帶外數(shù)據(jù),但是 UDP 不支持。 套接字口對(duì)帶外數(shù)據(jù)的支持很大程度上受 TCP 帶外數(shù)據(jù)具體實(shí)現(xiàn)的影響。
    TCP 將帶外數(shù)據(jù)成為 緊急數(shù)據(jù)( urgent data )。 TCP 僅支持一個(gè)字節(jié)的緊急數(shù)據(jù),但是允許緊急數(shù)據(jù)在普通數(shù)據(jù)傳遞機(jī)制數(shù)據(jù)流之外傳輸。
    8、非阻塞和異步 I/O
    9、小結(jié)
    本章討論了:
    ? 套接字端點(diǎn)如何命名,在連接服務(wù)器時(shí),如何發(fā)現(xiàn)所用的地址。
    ? 給出了采用無連接的(即基于數(shù)據(jù)報(bào)的)套接字和面向連接的套接字的客戶端和服務(wù)器的實(shí)例;
    ? 討論了 異步和 阻塞的套接字 I/O;
    ? 用于管理套接字選項(xiàng)的接口。
    第 17 章-高級(jí)進(jìn)程間通信
    1、引言
    本章將會(huì):
    ? 介紹一種高級(jí) IPC(進(jìn)程間通信)——UNIX 域套接字機(jī)制,并說明它的應(yīng)用方法。這種形式的 IPC 可以在同一計(jì)算機(jī)系統(tǒng)上運(yùn)行的兩個(gè)進(jìn)程之間傳送打開文件描述符。
    ? 服務(wù)進(jìn)程可以使它們打開的文件描述符與指定的名字相關(guān)聯(lián),同一系統(tǒng)上運(yùn)行的客戶進(jìn)程可以使用這些名字與服務(wù)器進(jìn)程匯聚。
    ? 還會(huì)了解到操作系統(tǒng)如何為每一個(gè)客戶進(jìn)程提供一個(gè)獨(dú)用的 IPC 通道。

    2、 UNIX域套接字
    UNIX 域套接字用于在同一臺(tái)計(jì)算機(jī)上運(yùn)行的進(jìn)程之間的通信。
    雖然因特網(wǎng)網(wǎng)域套接字可以用于同一目的,但 UNIX 域套接字的效率更高。
    UNIX 域套接字提供流和數(shù)據(jù)報(bào)兩種接口,UNIX 域套接字更像是套接字和管道的混合。
    3、唯一連接
    服務(wù)器進(jìn)程可以使用標(biāo)準(zhǔn) blind、listen 和 accept函數(shù),為客戶進(jìn)程安排一個(gè)唯一 UNIX 域連接。客戶進(jìn)程使用 connect 與服務(wù)器進(jìn)程聯(lián)系。在服務(wù)器進(jìn)程接受了 connect 請(qǐng)求后,在服務(wù)器進(jìn)程和客戶進(jìn)程之間就存在了 唯一連接。
    4、傳送文件描述符
    傳送文件描述符可以使一個(gè)進(jìn)程(通常是服務(wù)器進(jìn)程)能夠處理打開一個(gè)文件所要做的一切操作(包括將網(wǎng)絡(luò)名翻譯為網(wǎng)絡(luò)地址、撥號(hào)調(diào)制調(diào)節(jié)器、協(xié)商文件鎖等)以及向調(diào)用進(jìn)程送回一個(gè)描述符,該描述符可被用于以后的所有 I/O 函數(shù)。
    5、 打開服務(wù)器進(jìn)程第 1 版
    6、 打開服務(wù)器進(jìn)程第 2 版
    7、小結(jié)
    如何在兩個(gè)進(jìn)程之間傳送文件描述符,以及服務(wù)器進(jìn)程如何接受來自客戶進(jìn)程的唯一連接。
    了解了如何用它們來實(shí)現(xiàn)一個(gè)全雙工的管道以及如何利用它們來適應(yīng) 14.4 節(jié)的 I/O多路轉(zhuǎn)接函數(shù)以間接地用于 XSI 消息隊(duì)列中。
    第 18 章- 終端 I/O

    總結(jié)

    以上是生活随笔為你收集整理的《UNIX环境高级编程——APUE》的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    国产日产欧产精品精品app | 国产后入清纯学生妹 | 国产一精品一av一免费 | 又色又爽又黄的美女裸体网站 | 国产精品久久久久久无码 | 国产成人人人97超碰超爽8 | 欧美xxxxx精品 | 国产人妻久久精品二区三区老狼 | 色综合久久中文娱乐网 | 国产精品鲁鲁鲁 | 一本色道久久综合狠狠躁 | 精品国产麻豆免费人成网站 | 亚洲最大成人网站 | 1000部夫妻午夜免费 | 久久久亚洲欧洲日产国码αv | 狠狠色噜噜狠狠狠7777奇米 | 日韩av激情在线观看 | 亚洲成在人网站无码天堂 | 久久久久久av无码免费看大片 | 丝袜 中出 制服 人妻 美腿 | 久久www免费人成人片 | 午夜性刺激在线视频免费 | 日本熟妇大屁股人妻 | 成人影院yy111111在线观看 | 欧美成人高清在线播放 | 免费无码av一区二区 | 青青青爽视频在线观看 | 中文字幕中文有码在线 | 亚洲熟熟妇xxxx | 国产无套内射久久久国产 | 亚洲男人av天堂午夜在 | 久久久久成人片免费观看蜜芽 | 日本熟妇乱子伦xxxx | 激情五月综合色婷婷一区二区 | 天天躁日日躁狠狠躁免费麻豆 | 无码人妻出轨黑人中文字幕 | 日日天日日夜日日摸 | 永久免费观看美女裸体的网站 | 奇米影视888欧美在线观看 | 亚洲自偷自拍另类第1页 | 国产精品亚洲lv粉色 | 国产亚洲精品久久久ai换 | av无码电影一区二区三区 | 久久人人爽人人爽人人片ⅴ | 欧美激情一区二区三区成人 | 人妻无码αv中文字幕久久琪琪布 | 成人欧美一区二区三区 | 日本一区二区三区免费高清 | 国产精品久久久一区二区三区 | 精品国产成人一区二区三区 | 欧美国产日韩久久mv | 国产精品丝袜黑色高跟鞋 | 亚洲精品一区三区三区在线观看 | 九九热爱视频精品 | 一区二区三区乱码在线 | 欧洲 | 亚洲精品国偷拍自产在线麻豆 | 麻豆国产97在线 | 欧洲 | 欧美 日韩 人妻 高清 中文 | 亚洲国产一区二区三区在线观看 | 国产凸凹视频一区二区 | 爆乳一区二区三区无码 | 任你躁国产自任一区二区三区 | 成人欧美一区二区三区 | 亚洲国产精品一区二区美利坚 | 欧美刺激性大交 | 亚洲精品综合五月久久小说 | 国产午夜亚洲精品不卡下载 | 激情爆乳一区二区三区 | 亚洲国产av美女网站 | 国产国产精品人在线视 | 97久久国产亚洲精品超碰热 | 中文字幕人妻无码一区二区三区 | 奇米影视888欧美在线观看 | 天堂在线观看www | 青春草在线视频免费观看 | 久久精品一区二区三区四区 | 男人的天堂av网站 | 内射后入在线观看一区 | 国产一区二区三区四区五区加勒比 | 欧美大屁股xxxxhd黑色 | 少妇无套内谢久久久久 | 午夜免费福利小电影 | 欧美熟妇另类久久久久久不卡 | 婷婷五月综合缴情在线视频 | 日本精品久久久久中文字幕 | 国产成人一区二区三区在线观看 | 丰满少妇熟乱xxxxx视频 | 亚洲综合无码一区二区三区 | 久久天天躁狠狠躁夜夜免费观看 | 少妇无码av无码专区在线观看 | 国产精品久久国产精品99 | 国产精品毛多多水多 | 牛和人交xxxx欧美 | 在线天堂新版最新版在线8 | 性欧美大战久久久久久久 | 一本久道久久综合婷婷五月 | 婷婷丁香五月天综合东京热 | 欧美真人作爱免费视频 | 日韩欧美成人免费观看 | 欧美日韩人成综合在线播放 | 内射白嫩少妇超碰 | 欧美丰满熟妇xxxx | 国产成人人人97超碰超爽8 | 成年美女黄网站色大免费全看 | 香蕉久久久久久av成人 | 国产精品第一区揄拍无码 | 日日碰狠狠丁香久燥 | 97色伦图片97综合影院 | 无套内谢的新婚少妇国语播放 | 色婷婷欧美在线播放内射 | 久久精品女人的天堂av | 亚洲一区二区三区无码久久 | 国产综合色产在线精品 | 久久人人爽人人人人片 | 欧美第一黄网免费网站 | 欧美精品免费观看二区 | 97精品国产97久久久久久免费 | 成人av无码一区二区三区 | 国产精品无码mv在线观看 | 亚洲无人区一区二区三区 | 亚洲国产精品无码一区二区三区 | av无码久久久久不卡免费网站 | 国产亚洲精品久久久久久国模美 | 亚洲午夜福利在线观看 | 一本久道久久综合狠狠爱 | 97资源共享在线视频 | 久久久久99精品成人片 | 国产农村妇女高潮大叫 | 动漫av一区二区在线观看 | 人妻少妇精品久久 | 成在人线av无码免费 | 日本大香伊一区二区三区 | 国产人妻久久精品二区三区老狼 | 无码帝国www无码专区色综合 | 欧美老人巨大xxxx做受 | 欧美国产亚洲日韩在线二区 | 欧美熟妇另类久久久久久多毛 | 国语精品一区二区三区 | 岛国片人妻三上悠亚 | 欧美国产日韩亚洲中文 | 国产色在线 | 国产 | av香港经典三级级 在线 | a国产一区二区免费入口 | 久久亚洲精品中文字幕无男同 | 午夜精品久久久内射近拍高清 | 国产一区二区三区精品视频 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 亚洲精品综合一区二区三区在线 | 噜噜噜亚洲色成人网站 | 女人被男人躁得好爽免费视频 | 久久人人爽人人人人片 | 999久久久国产精品消防器材 | 国产成人精品视频ⅴa片软件竹菊 | 色欲久久久天天天综合网精品 | 色欲久久久天天天综合网精品 | 国产一区二区不卡老阿姨 | 欧美激情一区二区三区成人 | 国产偷国产偷精品高清尤物 | 精品一二三区久久aaa片 | 国产精品第一国产精品 | 图片小说视频一区二区 | 亚洲熟妇色xxxxx欧美老妇 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 日欧一片内射va在线影院 | 国产成人精品一区二区在线小狼 | 在线成人www免费观看视频 | 精品国产一区二区三区四区 | 色 综合 欧美 亚洲 国产 | 女人和拘做爰正片视频 | 欧美日韩在线亚洲综合国产人 | 国模大胆一区二区三区 | 女人高潮内射99精品 | 久久无码专区国产精品s | 亚洲国产日韩a在线播放 | 在线a亚洲视频播放在线观看 | 中文字幕亚洲情99在线 | 国产莉萝无码av在线播放 | 亚洲欧洲无卡二区视頻 | 国产成人无码av一区二区 | 无遮无挡爽爽免费视频 | 日韩精品成人一区二区三区 | 亚洲人成影院在线观看 | 老司机亚洲精品影院无码 | 国产精品无套呻吟在线 | 97无码免费人妻超级碰碰夜夜 | 国产av一区二区三区最新精品 | 免费人成在线视频无码 | 伊在人天堂亚洲香蕉精品区 | 性欧美牲交xxxxx视频 | 欧美乱妇无乱码大黄a片 | 强辱丰满人妻hd中文字幕 | 秋霞特色aa大片 | 国产精品怡红院永久免费 | 国产精品亚洲一区二区三区喷水 | 少妇的肉体aa片免费 | 国产精品香蕉在线观看 | 国产午夜福利100集发布 | 久久五月精品中文字幕 | 欧美老熟妇乱xxxxx | 欧美国产日产一区二区 | 色综合久久88色综合天天 | 国产乱子伦视频在线播放 | 欧美人与动性行为视频 | 日本一区二区三区免费播放 | 日日麻批免费40分钟无码 | 思思久久99热只有频精品66 | 久久久久久国产精品无码下载 | 欧美国产日产一区二区 | √天堂中文官网8在线 | 欧美 亚洲 国产 另类 | 在线观看国产一区二区三区 | 夜夜高潮次次欢爽av女 | 久久aⅴ免费观看 | 精品一区二区三区无码免费视频 | 伊人久久大香线蕉午夜 | 2020久久香蕉国产线看观看 | 夜夜高潮次次欢爽av女 | 成人性做爰aaa片免费看不忠 | av无码不卡在线观看免费 | 色综合久久久无码网中文 | 亚洲成a人片在线观看无码3d | 少妇邻居内射在线 | 自拍偷自拍亚洲精品被多人伦好爽 | 亚洲精品中文字幕久久久久 | 巨爆乳无码视频在线观看 | 永久免费观看国产裸体美女 | 亚洲日本在线电影 | 亚洲综合色区中文字幕 | 爱做久久久久久 | 国产三级精品三级男人的天堂 | 亚洲大尺度无码无码专区 | 少妇性l交大片欧洲热妇乱xxx | 装睡被陌生人摸出水好爽 | 99视频精品全部免费免费观看 | 亚洲国产精品一区二区第一页 | 欧美成人高清在线播放 | 亚洲色欲色欲欲www在线 | 大乳丰满人妻中文字幕日本 | 国产精品无码一区二区桃花视频 | 免费看少妇作爱视频 | 日韩无码专区 | 理论片87福利理论电影 | 国产精品亚洲综合色区韩国 | 国产精品亚洲综合色区韩国 | 精品国产一区二区三区av 性色 | 日本熟妇人妻xxxxx人hd | 蜜臀av在线播放 久久综合激激的五月天 | 黑人玩弄人妻中文在线 | 人妻与老人中文字幕 | 久久久久久a亚洲欧洲av冫 | 免费观看又污又黄的网站 | 2019nv天堂香蕉在线观看 | 亚洲色偷偷偷综合网 | 亚洲中文字幕乱码av波多ji | 欧美人与物videos另类 | 成人免费视频视频在线观看 免费 | 18精品久久久无码午夜福利 | 蜜桃视频插满18在线观看 | 日日碰狠狠丁香久燥 | 欧美xxxxx精品 | 精品久久久久久人妻无码中文字幕 | 国产精品久久久午夜夜伦鲁鲁 | 狠狠亚洲超碰狼人久久 | 丰满人妻精品国产99aⅴ | 中文无码伦av中文字幕 | 欧洲精品码一区二区三区免费看 | 人人澡人人透人人爽 | 国内少妇偷人精品视频免费 | 好屌草这里只有精品 | 国产三级精品三级男人的天堂 | 亚洲精品欧美二区三区中文字幕 | 人人妻人人澡人人爽欧美一区九九 | 国产人妻精品一区二区三区不卡 | 樱花草在线社区www | 在线欧美精品一区二区三区 | 性色av无码免费一区二区三区 | 18禁黄网站男男禁片免费观看 | 午夜福利一区二区三区在线观看 | 99久久精品国产一区二区蜜芽 | 久久久久亚洲精品男人的天堂 | 亚洲第一无码av无码专区 | 欧美日本免费一区二区三区 | 国产成人无码一二三区视频 | 永久免费观看美女裸体的网站 | 乱码av麻豆丝袜熟女系列 | 久久久久久久久888 | 国产农村妇女高潮大叫 | 亚洲欧洲无卡二区视頻 | 久久久久久久久蜜桃 | 国产熟女一区二区三区四区五区 | 亚洲gv猛男gv无码男同 | 日韩av无码一区二区三区 | 久久久久免费精品国产 | 久在线观看福利视频 | 国产又爽又黄又刺激的视频 | 动漫av一区二区在线观看 | 国产 精品 自在自线 | 日韩欧美群交p片內射中文 | 狠狠亚洲超碰狼人久久 | 国产乱人无码伦av在线a | 性开放的女人aaa片 | 国产精品人人妻人人爽 | 粉嫩少妇内射浓精videos | 国产卡一卡二卡三 | 亚洲色欲色欲天天天www | 国产国语老龄妇女a片 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 精品无码av一区二区三区 | 亚洲区欧美区综合区自拍区 | 男女爱爱好爽视频免费看 | 亚洲乱码国产乱码精品精 | 东京热一精品无码av | 99精品视频在线观看免费 | 久久99精品国产.久久久久 | av人摸人人人澡人人超碰下载 | 婷婷综合久久中文字幕蜜桃三电影 | 亚洲狠狠婷婷综合久久 | a在线亚洲男人的天堂 | 最新国产麻豆aⅴ精品无码 | 成人女人看片免费视频放人 | 国产超级va在线观看视频 | 国产精品对白交换视频 | 亚洲国产精品久久人人爱 | 国产精品沙发午睡系列 | 人妻无码久久精品人妻 | 精品国产青草久久久久福利 | 日产精品99久久久久久 | 亚洲精品国产精品乱码不卡 | 亚洲中文字幕va福利 | 国产又爽又黄又刺激的视频 | 荫蒂添的好舒服视频囗交 | 亚洲日韩一区二区三区 | 国产午夜无码精品免费看 | 熟妇人妻激情偷爽文 | 日本大香伊一区二区三区 | 亚洲 日韩 欧美 成人 在线观看 | 精品无人区无码乱码毛片国产 | 日日夜夜撸啊撸 | 国产极品美女高潮无套在线观看 | 老子影院午夜精品无码 | 大胆欧美熟妇xx | 国产真实夫妇视频 | 一区二区传媒有限公司 | 亚洲狠狠婷婷综合久久 | 欧美日韩一区二区综合 | 爆乳一区二区三区无码 | 欧美人与禽zoz0性伦交 | 国产一区二区三区四区五区加勒比 | 国产两女互慰高潮视频在线观看 | 久久久精品成人免费观看 | 亚洲成熟女人毛毛耸耸多 | 欧美真人作爱免费视频 | 久久久久亚洲精品男人的天堂 | 青草青草久热国产精品 | 国产亚洲精品久久久久久大师 | 国产色精品久久人妻 | 激情亚洲一区国产精品 | 中文精品久久久久人妻不卡 | 中文字幕无码日韩专区 | 久久久久久亚洲精品a片成人 | 少妇性俱乐部纵欲狂欢电影 | 精品熟女少妇av免费观看 | 久久无码人妻影院 | 国产香蕉97碰碰久久人人 | 老太婆性杂交欧美肥老太 | 激情五月综合色婷婷一区二区 | 妺妺窝人体色www在线小说 | 亚洲va中文字幕无码久久不卡 | 国产色视频一区二区三区 | 亚洲va欧美va天堂v国产综合 | 在线播放亚洲第一字幕 | 亚洲国产综合无码一区 | 丰满妇女强制高潮18xxxx | 沈阳熟女露脸对白视频 | 扒开双腿吃奶呻吟做受视频 | 欧美午夜特黄aaaaaa片 | 国内老熟妇对白xxxxhd | aⅴ在线视频男人的天堂 | 国产精品18久久久久久麻辣 | 国产明星裸体无码xxxx视频 | 久久久久久a亚洲欧洲av冫 | 成人无码精品1区2区3区免费看 | 色诱久久久久综合网ywww | 粉嫩少妇内射浓精videos | 丝袜 中出 制服 人妻 美腿 | 国产精品亚洲综合色区韩国 | 国产人妻人伦精品1国产丝袜 | 亚洲国产精品久久久久久 | 久久久国产精品无码免费专区 | 国产深夜福利视频在线 | 国产av无码专区亚洲awww | 久久99精品久久久久久动态图 | 一二三四在线观看免费视频 | 中国大陆精品视频xxxx | 一本色道久久综合亚洲精品不卡 | 蜜桃av抽搐高潮一区二区 | 久久国产精品_国产精品 | 精品无码成人片一区二区98 | 国产麻豆精品精东影业av网站 | 国产日产欧产精品精品app | 久久久久免费精品国产 | 国产午夜视频在线观看 | 伊人久久大香线蕉av一区二区 | 1000部啪啪未满十八勿入下载 | 中文字幕无码日韩专区 | 娇妻被黑人粗大高潮白浆 | 无码乱肉视频免费大全合集 | 亚洲爆乳无码专区 | 色婷婷av一区二区三区之红樱桃 | 成人精品视频一区二区三区尤物 | 国产成人一区二区三区在线观看 | 久久精品人人做人人综合试看 | 久久亚洲精品成人无码 | 性啪啪chinese东北女人 | 国产精品久久国产精品99 | √天堂中文官网8在线 | 久久精品国产大片免费观看 | 丰满人妻精品国产99aⅴ | 在线亚洲高清揄拍自拍一品区 | 最新版天堂资源中文官网 | 欧美日韩精品 | 天堂久久天堂av色综合 | 又黄又爽又色的视频 | 亚洲国产高清在线观看视频 | 超碰97人人做人人爱少妇 | 亚洲无人区一区二区三区 | 久久亚洲精品成人无码 | 国产乱人偷精品人妻a片 | 国产成人一区二区三区别 | 欧美丰满少妇xxxx性 | 奇米影视7777久久精品 | 久久精品国产大片免费观看 | 无码人妻久久一区二区三区不卡 | 欧美日韩综合一区二区三区 | 成年女人永久免费看片 | 国产av无码专区亚洲a∨毛片 | 国产色在线 | 国产 | 国产亚洲视频中文字幕97精品 | 伊在人天堂亚洲香蕉精品区 | 亚洲综合精品香蕉久久网 | 国产国语老龄妇女a片 | 国产一精品一av一免费 | 免费观看又污又黄的网站 | 久久99精品久久久久婷婷 | 国色天香社区在线视频 | 亚洲综合久久一区二区 | 国产黑色丝袜在线播放 | 在线观看欧美一区二区三区 | 久久综合久久自在自线精品自 | 中文字幕无码av激情不卡 | 性史性农村dvd毛片 | 亚洲国产高清在线观看视频 | 人人妻人人澡人人爽人人精品浪潮 | 丝袜 中出 制服 人妻 美腿 | 99久久精品无码一区二区毛片 | 精品无码av一区二区三区 | 国产精品久久久久久无码 | 人妻与老人中文字幕 | 婷婷丁香六月激情综合啪 | 给我免费的视频在线观看 | 亚洲一区二区三区含羞草 | 永久免费精品精品永久-夜色 | 亚洲日韩一区二区三区 | 亚洲欧洲日本无在线码 | 国产人妻精品一区二区三区不卡 | 亚洲の无码国产の无码影院 | 18禁黄网站男男禁片免费观看 | 最近的中文字幕在线看视频 | 国产凸凹视频一区二区 | 纯爱无遮挡h肉动漫在线播放 | 波多野42部无码喷潮在线 | 久久久久久av无码免费看大片 | 亚洲人交乣女bbw | 麻花豆传媒剧国产免费mv在线 | 中文字幕乱码中文乱码51精品 | 国产av人人夜夜澡人人爽麻豆 | 亚洲阿v天堂在线 | 亚洲精品国偷拍自产在线观看蜜桃 | 国产特级毛片aaaaaaa高清 | 一本无码人妻在中文字幕免费 | 欧洲熟妇色 欧美 | 亚洲色欲久久久综合网东京热 | 波多野结衣av一区二区全免费观看 | 亚洲熟悉妇女xxx妇女av | 色老头在线一区二区三区 | 大肉大捧一进一出好爽视频 | 国产无套内射久久久国产 | 国产 精品 自在自线 | 亚洲精品久久久久久久久久久 | 国产精品久久精品三级 | 成人三级无码视频在线观看 | 国产精品无套呻吟在线 | 亚洲国产成人av在线观看 | aⅴ亚洲 日韩 色 图网站 播放 | 女人色极品影院 | 国产午夜视频在线观看 | 日本一区二区三区免费高清 | 国产卡一卡二卡三 | 国产精品国产自线拍免费软件 | 欧美野外疯狂做受xxxx高潮 | 麻豆精品国产精华精华液好用吗 | 亚洲狠狠色丁香婷婷综合 | 色老头在线一区二区三区 | 免费播放一区二区三区 | 夜夜高潮次次欢爽av女 | 曰韩无码二三区中文字幕 | 超碰97人人做人人爱少妇 | 国产后入清纯学生妹 | 性色欲网站人妻丰满中文久久不卡 | 精品无码成人片一区二区98 | 中文字幕人成乱码熟女app | 亚洲爆乳无码专区 | 亚洲精品中文字幕久久久久 | 国产色视频一区二区三区 | 青春草在线视频免费观看 | 帮老师解开蕾丝奶罩吸乳网站 | 欧美国产亚洲日韩在线二区 | 精品 日韩 国产 欧美 视频 | 性欧美videos高清精品 | 在线а√天堂中文官网 | 性色欲情网站iwww九文堂 | 真人与拘做受免费视频一 | 亚洲精品成人福利网站 | 一本色道久久综合亚洲精品不卡 | 人妻少妇被猛烈进入中文字幕 | 国产明星裸体无码xxxx视频 | 玩弄人妻少妇500系列视频 | 久久亚洲国产成人精品性色 | 国产在线精品一区二区高清不卡 | 亚洲综合精品香蕉久久网 | 亚洲精品久久久久avwww潮水 | 暴力强奷在线播放无码 | 亚洲欧洲无卡二区视頻 | 疯狂三人交性欧美 | 欧美三级a做爰在线观看 | 精品国精品国产自在久国产87 | 人妻插b视频一区二区三区 | 丰满护士巨好爽好大乳 | 亚洲中文无码av永久不收费 | 爆乳一区二区三区无码 | 荫蒂被男人添的好舒服爽免费视频 | 亚洲精品成人av在线 | 免费无码肉片在线观看 | 久热国产vs视频在线观看 | 欧美freesex黑人又粗又大 | 性欧美疯狂xxxxbbbb | 国产在线精品一区二区三区直播 | 成人精品天堂一区二区三区 | 无码乱肉视频免费大全合集 | 国内揄拍国内精品人妻 | 国产成人av免费观看 | 伊人久久大香线焦av综合影院 | 精品国产成人一区二区三区 | 大地资源网第二页免费观看 | 伊人久久大香线蕉亚洲 | 免费无码的av片在线观看 | 少妇一晚三次一区二区三区 | 欧美日韩一区二区综合 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 精品一区二区三区波多野结衣 | 少妇被黑人到高潮喷出白浆 | 亚洲爆乳大丰满无码专区 | 久久综合网欧美色妞网 | 少女韩国电视剧在线观看完整 | 曰本女人与公拘交酡免费视频 | 亚洲区小说区激情区图片区 | 性欧美疯狂xxxxbbbb | 亚洲 欧美 激情 小说 另类 | 熟妇人妻中文av无码 | 东北女人啪啪对白 | 久精品国产欧美亚洲色aⅴ大片 | 领导边摸边吃奶边做爽在线观看 | 国产亚洲视频中文字幕97精品 | 99久久久国产精品无码免费 | 曰韩少妇内射免费播放 | 国产精品.xx视频.xxtv | 中文无码精品a∨在线观看不卡 | 97人妻精品一区二区三区 | 欧美日本免费一区二区三区 | 国产网红无码精品视频 | 一本无码人妻在中文字幕免费 | 波多野结衣aⅴ在线 | 欧美日韩精品 | 曰本女人与公拘交酡免费视频 | 麻豆人妻少妇精品无码专区 | 成人av无码一区二区三区 | 久久精品国产一区二区三区肥胖 | 无套内射视频囯产 | 女高中生第一次破苞av | 亚洲午夜无码久久 | 一本色道久久综合狠狠躁 | 99精品国产综合久久久久五月天 | 精品无码国产一区二区三区av | 男女超爽视频免费播放 | 国产亚洲精品久久久久久久 | 大肉大捧一进一出视频出来呀 | 5858s亚洲色大成网站www | 亚洲一区二区三区在线观看网站 | 我要看www免费看插插视频 | 黑人巨大精品欧美一区二区 | 欧美性猛交xxxx富婆 | 无码人中文字幕 | 亚洲娇小与黑人巨大交 | 国产凸凹视频一区二区 | 欧美国产亚洲日韩在线二区 | 毛片内射-百度 | 国产熟女一区二区三区四区五区 | 免费人成网站视频在线观看 | 一本久道高清无码视频 | 国产高潮视频在线观看 | 女高中生第一次破苞av | 无码精品人妻一区二区三区av | 性史性农村dvd毛片 | 大地资源中文第3页 | 亚洲欧洲无卡二区视頻 | 国产精品鲁鲁鲁 | 亚洲国产av精品一区二区蜜芽 | 免费观看的无遮挡av | 亚洲日韩一区二区三区 | 色欲综合久久中文字幕网 | 波多野结衣高清一区二区三区 | 国产精品无码成人午夜电影 | 性色欲情网站iwww九文堂 | 精品欧洲av无码一区二区三区 | 日本一区二区三区免费高清 | 精品一二三区久久aaa片 | 国产精品久久精品三级 | 亚洲а∨天堂久久精品2021 | 国产情侣作爱视频免费观看 | 欧美性生交xxxxx久久久 | 狠狠亚洲超碰狼人久久 | 狠狠噜狠狠狠狠丁香五月 | 红桃av一区二区三区在线无码av | 大乳丰满人妻中文字幕日本 | 久久99热只有频精品8 | 丰满人妻翻云覆雨呻吟视频 | 岛国片人妻三上悠亚 | 日本大乳高潮视频在线观看 | 欧洲熟妇色 欧美 | 国产午夜福利亚洲第一 | 国产精品18久久久久久麻辣 | 久久综合九色综合97网 | 老熟女重囗味hdxx69 | 高潮毛片无遮挡高清免费 | 国产成人无码区免费内射一片色欲 | 亚洲中文字幕无码中文字在线 | 人人妻人人澡人人爽精品欧美 | 蜜桃视频插满18在线观看 | 乱中年女人伦av三区 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 成人av无码一区二区三区 | 久久国产精品偷任你爽任你 | 精品国产精品久久一区免费式 | 狠狠噜狠狠狠狠丁香五月 | 欧美成人免费全部网站 | 中文无码精品a∨在线观看不卡 | 成熟人妻av无码专区 | 亚洲七七久久桃花影院 | 日韩成人一区二区三区在线观看 | 成人aaa片一区国产精品 | 亚洲日韩精品欧美一区二区 | 国产成人无码a区在线观看视频app | 国产精品无套呻吟在线 | 婷婷综合久久中文字幕蜜桃三电影 | 国产成人综合美国十次 | 扒开双腿疯狂进出爽爽爽视频 | 亚洲啪av永久无码精品放毛片 | 精品日本一区二区三区在线观看 | 精品成人av一区二区三区 | 欧美丰满老熟妇xxxxx性 | 波多野结衣高清一区二区三区 | 人妻体内射精一区二区三四 | 精品午夜福利在线观看 | 色综合天天综合狠狠爱 | 国产九九九九九九九a片 | 正在播放老肥熟妇露脸 | 国产精品va在线观看无码 | 成人精品视频一区二区 | 久久亚洲精品中文字幕无男同 | 精品少妇爆乳无码av无码专区 | 亚洲男人av天堂午夜在 | 77777熟女视频在线观看 а天堂中文在线官网 | 在线天堂新版最新版在线8 | 青青青爽视频在线观看 | 日韩无套无码精品 | 久久久久亚洲精品男人的天堂 | 国产乱人无码伦av在线a | 欧美精品一区二区精品久久 | 水蜜桃亚洲一二三四在线 | 中文字幕亚洲情99在线 | 少妇一晚三次一区二区三区 | 日本爽爽爽爽爽爽在线观看免 | 久久精品女人天堂av免费观看 | 免费观看的无遮挡av | 2019午夜福利不卡片在线 | 国内揄拍国内精品人妻 | 成人亚洲精品久久久久 | 久久精品国产99久久6动漫 | 精品日本一区二区三区在线观看 | 国产亚洲欧美在线专区 | 亚洲色www成人永久网址 | 18禁止看的免费污网站 | 综合激情五月综合激情五月激情1 | 亚洲中文字幕在线无码一区二区 | 日本大乳高潮视频在线观看 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 精品日本一区二区三区在线观看 | 人妻少妇精品无码专区二区 | 亚洲人亚洲人成电影网站色 | 露脸叫床粗话东北少妇 | 久久精品视频在线看15 | 丰满肥臀大屁股熟妇激情视频 | 女人高潮内射99精品 | 丰满少妇高潮惨叫视频 | 黑人玩弄人妻中文在线 | 久久久国产精品无码免费专区 | 99麻豆久久久国产精品免费 | 图片小说视频一区二区 | 国产熟女一区二区三区四区五区 | 久9re热视频这里只有精品 | 亚洲精品国产精品乱码视色 | av香港经典三级级 在线 | 理论片87福利理论电影 | 国产成人亚洲综合无码 | 欧美日韩亚洲国产精品 | 日本爽爽爽爽爽爽在线观看免 | 国产午夜福利100集发布 | 国产精品久久久久影院嫩草 | 又大又硬又黄的免费视频 | 帮老师解开蕾丝奶罩吸乳网站 | 少妇邻居内射在线 | 丁香啪啪综合成人亚洲 | 红桃av一区二区三区在线无码av | 亚洲欧洲日本无在线码 | 又湿又紧又大又爽a视频国产 | a国产一区二区免费入口 | 亚洲国产高清在线观看视频 | 精品成在人线av无码免费看 | 在线观看免费人成视频 | v一区无码内射国产 | 色综合视频一区二区三区 | 亚洲精品成a人在线观看 | 亚洲欧美精品伊人久久 | 亚洲色欲色欲欲www在线 | 日本一区二区三区免费高清 | 国产成人综合在线女婷五月99播放 | 无码精品人妻一区二区三区av | 国产精品福利视频导航 | 波多野结衣 黑人 | 国产精品18久久久久久麻辣 | 国产亚洲人成在线播放 | 亚洲成熟女人毛毛耸耸多 | 在线欧美精品一区二区三区 | 色婷婷香蕉在线一区二区 | 午夜性刺激在线视频免费 | 亚洲无人区午夜福利码高清完整版 | 久久这里只有精品视频9 | 2020久久超碰国产精品最新 | 中文字幕 人妻熟女 | 人人妻人人澡人人爽人人精品浪潮 | 中文字幕av无码一区二区三区电影 | www一区二区www免费 | 无码精品国产va在线观看dvd | 久久人人爽人人爽人人片ⅴ | 性史性农村dvd毛片 | 中文字幕乱码中文乱码51精品 | 巨爆乳无码视频在线观看 | 亚洲综合伊人久久大杳蕉 | 亚洲成av人影院在线观看 | 久久精品国产大片免费观看 | 无码国模国产在线观看 | 青草视频在线播放 | 色婷婷av一区二区三区之红樱桃 | 人人妻人人澡人人爽欧美一区 | 国产亚洲人成a在线v网站 | 高清不卡一区二区三区 | 性色欲网站人妻丰满中文久久不卡 | 国产明星裸体无码xxxx视频 | 亚洲欧美综合区丁香五月小说 | 亚洲中文字幕成人无码 | 97久久国产亚洲精品超碰热 | 妺妺窝人体色www在线小说 | 综合人妻久久一区二区精品 | 日韩欧美中文字幕公布 | 人妻人人添人妻人人爱 | 国产一区二区三区日韩精品 | 欧洲美熟女乱又伦 | 女人高潮内射99精品 | 国产口爆吞精在线视频 | 国产人妻人伦精品 | 成人亚洲精品久久久久 | 国产精品二区一区二区aⅴ污介绍 | www国产亚洲精品久久网站 | 乱人伦人妻中文字幕无码久久网 | 国产精品香蕉在线观看 | 国产精品久久福利网站 | 丁香啪啪综合成人亚洲 | 色综合视频一区二区三区 | 亚洲中文字幕va福利 | 日本高清一区免费中文视频 | 成在人线av无码免费 | 亚洲大尺度无码无码专区 | 人人妻在人人 | 欧美熟妇另类久久久久久不卡 | 久久国产36精品色熟妇 | 精品成在人线av无码免费看 | 久久婷婷五月综合色国产香蕉 | 美女黄网站人色视频免费国产 | 久9re热视频这里只有精品 | 久久午夜夜伦鲁鲁片无码免费 | 国产精品99爱免费视频 | 性做久久久久久久久 | 中文字幕av伊人av无码av | 久久国语露脸国产精品电影 | 亚洲欧洲日本综合aⅴ在线 | 婷婷五月综合缴情在线视频 | 日本丰满熟妇videos | 日本va欧美va欧美va精品 | 国产高清av在线播放 | 中文毛片无遮挡高清免费 | 欧美野外疯狂做受xxxx高潮 | 少妇无码av无码专区在线观看 | 大肉大捧一进一出视频出来呀 | 国产av一区二区精品久久凹凸 | 亚洲人交乣女bbw | 亚洲色偷偷男人的天堂 | 久久久久久亚洲精品a片成人 | 欧美熟妇另类久久久久久不卡 | 亚洲精品久久久久久久久久久 | 桃花色综合影院 | 色欲久久久天天天综合网精品 | 人妻中文无码久热丝袜 | 久久久久久久女国产乱让韩 | 欧美日韩一区二区三区自拍 | 中文亚洲成a人片在线观看 | 精品乱码久久久久久久 | 日本精品少妇一区二区三区 | 成人精品视频一区二区三区尤物 | 亚洲自偷自偷在线制服 | 熟妇人妻无码xxx视频 | 丰腴饱满的极品熟妇 | 亚洲国产精品无码一区二区三区 | 色婷婷欧美在线播放内射 | 一本久久a久久精品vr综合 | 中文字幕无线码 | 国产亚洲欧美日韩亚洲中文色 | 国产综合在线观看 | 精品偷拍一区二区三区在线看 | 一个人看的视频www在线 | 欧美激情一区二区三区成人 | 嫩b人妻精品一区二区三区 | 天下第一社区视频www日本 | 无码吃奶揉捏奶头高潮视频 | 欧美zoozzooz性欧美 | 男女爱爱好爽视频免费看 | 玩弄少妇高潮ⅹxxxyw | 亚无码乱人伦一区二区 | 欧美大屁股xxxxhd黑色 | 午夜无码区在线观看 | 免费人成在线视频无码 | 熟妇人妻激情偷爽文 | 精品国精品国产自在久国产87 | 在线观看国产一区二区三区 | 色一情一乱一伦一区二区三欧美 | 亚洲精品一区二区三区婷婷月 | 99久久婷婷国产综合精品青草免费 | 国产口爆吞精在线视频 | 国产熟妇另类久久久久 | 亚洲自偷精品视频自拍 | 鲁大师影院在线观看 | 日本精品人妻无码免费大全 | 午夜精品久久久久久久 | 荫蒂添的好舒服视频囗交 | 亚洲精品成人av在线 | 人妻无码αv中文字幕久久琪琪布 | 鲁一鲁av2019在线 | 国产成人一区二区三区在线观看 | 内射爽无广熟女亚洲 | 国产成人精品必看 | 久久午夜无码鲁丝片秋霞 | 日韩在线不卡免费视频一区 | 久久97精品久久久久久久不卡 | 中文亚洲成a人片在线观看 | 成人免费视频在线观看 | 99久久人妻精品免费二区 | v一区无码内射国产 | 2020最新国产自产精品 | 丰满少妇弄高潮了www | 人人澡人摸人人添 | 少妇人妻偷人精品无码视频 | 高中生自慰www网站 | 国产97色在线 | 免 | 狂野欧美性猛xxxx乱大交 | 18禁止看的免费污网站 | 男人和女人高潮免费网站 | 中国大陆精品视频xxxx | 18黄暴禁片在线观看 | 中国女人内谢69xxxx | 性色欲情网站iwww九文堂 | 精品亚洲韩国一区二区三区 | 日韩精品无码免费一区二区三区 | 麻花豆传媒剧国产免费mv在线 | 欧美怡红院免费全部视频 | 亚洲欧美国产精品专区久久 | 国产一区二区三区四区五区加勒比 | 精品一区二区不卡无码av | 欧美人与物videos另类 | 国产真人无遮挡作爱免费视频 | 国产精华av午夜在线观看 | 日产国产精品亚洲系列 | 国色天香社区在线视频 | 亚洲国产综合无码一区 | 国产xxx69麻豆国语对白 | 性欧美videos高清精品 | 丝袜足控一区二区三区 | 欧美成人午夜精品久久久 | 国内精品久久毛片一区二区 | 骚片av蜜桃精品一区 | 久久国语露脸国产精品电影 | 性欧美videos高清精品 | 天天av天天av天天透 | 国产午夜亚洲精品不卡 | 久久久精品成人免费观看 | 亚洲一区二区三区在线观看网站 | 亚洲中文字幕在线观看 | 亚洲精品一区二区三区在线观看 | 欧美熟妇另类久久久久久不卡 | 东京热无码av男人的天堂 | 人人妻人人澡人人爽欧美一区九九 | 久久久久99精品国产片 | 思思久久99热只有频精品66 | 亚洲春色在线视频 | 无码av最新清无码专区吞精 | 国产精品人妻一区二区三区四 | 精品久久8x国产免费观看 | 精品厕所偷拍各类美女tp嘘嘘 | 亚欧洲精品在线视频免费观看 | 国产极品美女高潮无套在线观看 | 又粗又大又硬又长又爽 | 无码av免费一区二区三区试看 | 日韩亚洲欧美精品综合 | 国产成人综合在线女婷五月99播放 | 亚洲 欧美 激情 小说 另类 | 色偷偷人人澡人人爽人人模 | 伊人色综合久久天天小片 | 精品久久久无码人妻字幂 | 成人一在线视频日韩国产 | 亚洲精品成人福利网站 | 久久国产精品二国产精品 | 国产精品久久福利网站 | 亚洲精品午夜无码电影网 | 亚洲精品国产a久久久久久 | 好屌草这里只有精品 | 十八禁真人啪啪免费网站 | 亚洲色无码一区二区三区 | 色综合久久中文娱乐网 | 激情爆乳一区二区三区 | 中文字幕乱妇无码av在线 | 在教室伦流澡到高潮hnp视频 | 亚洲乱码中文字幕在线 | 久久精品国产99久久6动漫 | 香港三级日本三级妇三级 | 人人妻人人澡人人爽人人精品浪潮 | 久久精品成人欧美大片 | 色综合久久88色综合天天 | 两性色午夜视频免费播放 | 亚洲国产欧美日韩精品一区二区三区 | 亚洲国产日韩a在线播放 | av无码久久久久不卡免费网站 | 日本成熟视频免费视频 | 黑人大群体交免费视频 | 综合网日日天干夜夜久久 | 永久黄网站色视频免费直播 | 九九热爱视频精品 | 国产无av码在线观看 | 扒开双腿疯狂进出爽爽爽视频 | 亚洲精品久久久久avwww潮水 | 麻豆md0077饥渴少妇 | 2020最新国产自产精品 | 亚洲毛片av日韩av无码 | 最新国产麻豆aⅴ精品无码 | 狠狠色丁香久久婷婷综合五月 | 六十路熟妇乱子伦 | 欧美熟妇另类久久久久久不卡 | 久久久无码中文字幕久... | 久久久久成人片免费观看蜜芽 | 久久精品人人做人人综合 | 牲欲强的熟妇农村老妇女 | 色一情一乱一伦一区二区三欧美 | 两性色午夜免费视频 | 国产精品高潮呻吟av久久4虎 | 色诱久久久久综合网ywww | 国产人成高清在线视频99最全资源 | 亚洲精品国产品国语在线观看 | 亚洲日韩中文字幕在线播放 | 中国大陆精品视频xxxx | 国产精品无码mv在线观看 | 国产精品无码mv在线观看 | 日欧一片内射va在线影院 | 天堂а√在线地址中文在线 | 少妇愉情理伦片bd | 欧洲美熟女乱又伦 | 波多野结衣av在线观看 | 麻豆国产人妻欲求不满 | 伊人色综合久久天天小片 | 亚洲男人av香蕉爽爽爽爽 | 18无码粉嫩小泬无套在线观看 | 久久精品国产99久久6动漫 | 国产艳妇av在线观看果冻传媒 | 精品人妻人人做人人爽夜夜爽 | 国产两女互慰高潮视频在线观看 | 装睡被陌生人摸出水好爽 | 小sao货水好多真紧h无码视频 | 亚洲中文字幕乱码av波多ji | 国产美女极度色诱视频www | 呦交小u女精品视频 | 欧美乱妇无乱码大黄a片 | 久久久久久亚洲精品a片成人 | 国产偷自视频区视频 | 伊人久久婷婷五月综合97色 | 久久精品国产一区二区三区 | 中文字幕无码免费久久99 | 蜜臀aⅴ国产精品久久久国产老师 | 性欧美videos高清精品 | 亚洲 a v无 码免 费 成 人 a v | 欧美日韩一区二区免费视频 | 日本高清一区免费中文视频 | 国产精品igao视频网 | 色一情一乱一伦一区二区三欧美 | 少妇无套内谢久久久久 | 亚洲国产欧美在线成人 | 亚洲爆乳无码专区 | 久久久久99精品国产片 | 极品尤物被啪到呻吟喷水 | 午夜精品一区二区三区在线观看 | 乱人伦人妻中文字幕无码久久网 | 亚洲乱码日产精品bd | 久久精品国产精品国产精品污 | 中文久久乱码一区二区 | 超碰97人人做人人爱少妇 | 亚洲国产av精品一区二区蜜芽 | 国产亚洲精品久久久久久久 | 亚洲另类伦春色综合小说 | 午夜福利试看120秒体验区 | 天天拍夜夜添久久精品大 | 桃花色综合影院 | 帮老师解开蕾丝奶罩吸乳网站 | 一本大道久久东京热无码av | 国产又爽又猛又粗的视频a片 | 久久久久久av无码免费看大片 | 日韩欧美中文字幕公布 | 欧美野外疯狂做受xxxx高潮 | 国产超级va在线观看视频 | 精品国产国产综合精品 | 伊人久久婷婷五月综合97色 | 夜夜躁日日躁狠狠久久av | 国内综合精品午夜久久资源 | 国产熟女一区二区三区四区五区 | 樱花草在线社区www | 奇米影视888欧美在线观看 | 欧美35页视频在线观看 | 岛国片人妻三上悠亚 | 老太婆性杂交欧美肥老太 | 亚洲码国产精品高潮在线 | 老子影院午夜伦不卡 | 无码人妻久久一区二区三区不卡 | 亚洲熟妇色xxxxx欧美老妇y | 特黄特色大片免费播放器图片 | 国产成人人人97超碰超爽8 | 国产偷抇久久精品a片69 | 久久久久亚洲精品中文字幕 | 熟女俱乐部五十路六十路av | 鲁大师影院在线观看 | 搡女人真爽免费视频大全 | 欧美老熟妇乱xxxxx | 亚洲精品鲁一鲁一区二区三区 | 亚洲色偷偷男人的天堂 | 无码一区二区三区在线观看 | 一本色道久久综合狠狠躁 | 久久国产精品偷任你爽任你 | 啦啦啦www在线观看免费视频 | 国产精品沙发午睡系列 | 国产又粗又硬又大爽黄老大爷视 | 内射欧美老妇wbb | 九九综合va免费看 | 美女黄网站人色视频免费国产 | 亚洲日韩av片在线观看 | 亚洲精品国偷拍自产在线观看蜜桃 | 亚洲欧美综合区丁香五月小说 | 欧美性生交活xxxxxdddd | 亚洲精品中文字幕乱码 | 中文字幕乱码人妻二区三区 | 99riav国产精品视频 | 蜜臀av无码人妻精品 | 成人aaa片一区国产精品 | 成人免费视频一区二区 | 黄网在线观看免费网站 | 黑人粗大猛烈进出高潮视频 | 精品久久综合1区2区3区激情 | 日本大香伊一区二区三区 | 内射巨臀欧美在线视频 | 夜先锋av资源网站 | 色一情一乱一伦 | аⅴ资源天堂资源库在线 | 亚洲无人区一区二区三区 | 国产性生大片免费观看性 | 老头边吃奶边弄进去呻吟 | 亚洲熟妇自偷自拍另类 | 丰满肥臀大屁股熟妇激情视频 | 色一情一乱一伦一视频免费看 | 内射巨臀欧美在线视频 | 成人亚洲精品久久久久软件 | 女人和拘做爰正片视频 | 天堂а√在线中文在线 | 4hu四虎永久在线观看 | 成在人线av无码免观看麻豆 | 久久视频在线观看精品 | 久久久精品国产sm最大网站 | a片在线免费观看 | 人人超人人超碰超国产 | 日韩无码专区 | 国产精品99爱免费视频 | 粗大的内捧猛烈进出视频 | 欧美精品国产综合久久 | 国产美女极度色诱视频www | 久久综合色之久久综合 | 久久这里只有精品视频9 | 亚洲精品成a人在线观看 | 久久99久久99精品中文字幕 | 精品国精品国产自在久国产87 | 99久久久无码国产精品免费 | 少妇一晚三次一区二区三区 | аⅴ资源天堂资源库在线 | 亚洲小说春色综合另类 | 久久精品国产大片免费观看 | 亚洲色欲色欲欲www在线 | 少妇无套内谢久久久久 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 欧美精品在线观看 | 男女爱爱好爽视频免费看 | 精品水蜜桃久久久久久久 | 精品无码国产自产拍在线观看蜜 | 午夜精品一区二区三区在线观看 | 强伦人妻一区二区三区视频18 | 欧美色就是色 | 国产精品美女久久久久av爽李琼 | 国产精品对白交换视频 | 野狼第一精品社区 | 我要看www免费看插插视频 | 欧美35页视频在线观看 | www国产亚洲精品久久久日本 | 国产97人人超碰caoprom | 狠狠cao日日穞夜夜穞av | 久久亚洲中文字幕精品一区 | 色综合久久久无码中文字幕 | 波多野结衣乳巨码无在线观看 | 欧美老妇交乱视频在线观看 | 成人无码视频在线观看网站 | 亚洲成av人在线观看网址 | 欧美成人高清在线播放 | 99久久亚洲精品无码毛片 | 99久久久无码国产精品免费 | 亚洲狠狠色丁香婷婷综合 | 最近中文2019字幕第二页 | 成人无码视频在线观看网站 | 日韩成人一区二区三区在线观看 | 强开小婷嫩苞又嫩又紧视频 | 女人被男人爽到呻吟的视频 | 精品一区二区不卡无码av | 亚洲精品国产a久久久久久 | 欧美性生交活xxxxxdddd | 熟女体下毛毛黑森林 | 好屌草这里只有精品 | 国产精品第一国产精品 | 老熟女重囗味hdxx69 | 国产成人精品无码播放 | 日韩精品无码一本二本三本色 | 日本在线高清不卡免费播放 | 夜夜夜高潮夜夜爽夜夜爰爰 | 久久久久人妻一区精品色欧美 | 国产三级久久久精品麻豆三级 | 欧美老熟妇乱xxxxx | 乌克兰少妇xxxx做受 | 中文无码成人免费视频在线观看 | 成熟妇人a片免费看网站 | 欧美成人免费全部网站 | 激情综合激情五月俺也去 | 免费无码的av片在线观看 | 国产精品福利视频导航 | 人人爽人人爽人人片av亚洲 | 国产成人一区二区三区别 | 又大又黄又粗又爽的免费视频 | 成在人线av无码免费 | 亚洲乱码日产精品bd | 久久亚洲中文字幕精品一区 | 一本无码人妻在中文字幕免费 | 国产精品理论片在线观看 | 亚洲精品综合五月久久小说 | 亚洲精品久久久久久一区二区 | 亚洲va中文字幕无码久久不卡 | 中文字幕av无码一区二区三区电影 | 男女性色大片免费网站 | 成人一在线视频日韩国产 | 十八禁真人啪啪免费网站 | 成年美女黄网站色大免费视频 | 成年女人永久免费看片 | 亚洲精品一区二区三区四区五区 | 亚洲色欲色欲天天天www | 樱花草在线播放免费中文 | 亚洲成av人综合在线观看 | 色综合久久久久综合一本到桃花网 | 欧美大屁股xxxxhd黑色 | 无码国产激情在线观看 | 亚洲啪av永久无码精品放毛片 | 国产乡下妇女做爰 | 中文字幕无码免费久久9一区9 | 永久免费精品精品永久-夜色 | 精品少妇爆乳无码av无码专区 | 无码人妻久久一区二区三区不卡 | 天天av天天av天天透 | 在线观看免费人成视频 | 婷婷综合久久中文字幕蜜桃三电影 | 久久 国产 尿 小便 嘘嘘 | 午夜精品一区二区三区在线观看 | 久久无码专区国产精品s | 国产内射老熟女aaaa | 人妻互换免费中文字幕 | 成人免费无码大片a毛片 | 无码人妻精品一区二区三区不卡 | 丰满少妇女裸体bbw | 永久免费观看国产裸体美女 | 成人免费视频视频在线观看 免费 | 国产精品视频免费播放 | 日韩无套无码精品 | 99久久人妻精品免费一区 | 天天燥日日燥 | 精品少妇爆乳无码av无码专区 | 偷窥日本少妇撒尿chinese | 嫩b人妻精品一区二区三区 | 内射后入在线观看一区 | 成人免费视频在线观看 | 成熟人妻av无码专区 | 97夜夜澡人人爽人人喊中国片 | 亚洲精品久久久久中文第一幕 | 男女性色大片免费网站 | 水蜜桃亚洲一二三四在线 | 少妇无套内谢久久久久 | 无码人妻丰满熟妇区毛片18 | 亚洲精品国产品国语在线观看 | 亚洲国产精品无码一区二区三区 | 成人片黄网站色大片免费观看 | 波多野结衣一区二区三区av免费 | 日韩精品成人一区二区三区 | 九九综合va免费看 | 99久久人妻精品免费一区 | 欧美精品一区二区精品久久 | 丁香啪啪综合成人亚洲 | 狂野欧美激情性xxxx | 亚洲区欧美区综合区自拍区 | 亚洲男人av香蕉爽爽爽爽 | 鲁一鲁av2019在线 | 国产亚洲欧美在线专区 | 亚洲欧美综合区丁香五月小说 | 学生妹亚洲一区二区 | 中文无码伦av中文字幕 | 六十路熟妇乱子伦 | 国产区女主播在线观看 | 国产精品久久精品三级 | 牛和人交xxxx欧美 | 久久人妻内射无码一区三区 | 人人妻人人澡人人爽精品欧美 | 久久97精品久久久久久久不卡 | 欧美日韩一区二区三区自拍 | 久久午夜无码鲁丝片秋霞 | 最新国产麻豆aⅴ精品无码 | 草草网站影院白丝内射 | 亚无码乱人伦一区二区 | 久久久久av无码免费网 | 国产精品办公室沙发 | 好屌草这里只有精品 | 精品国偷自产在线 | 亚洲国产精品美女久久久久 | 性生交大片免费看女人按摩摩 | 欧美精品无码一区二区三区 | 一个人免费观看的www视频 | 国产一区二区三区四区五区加勒比 | 鲁鲁鲁爽爽爽在线视频观看 | 日韩亚洲欧美精品综合 | 一个人免费观看的www视频 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 色妞www精品免费视频 | 午夜福利试看120秒体验区 | 欧美一区二区三区 | 亚洲色www成人永久网址 | 无码一区二区三区在线观看 | 久久99国产综合精品 | 亚洲无人区午夜福利码高清完整版 | 欧美成人高清在线播放 | 国产精品美女久久久 | 丝袜 中出 制服 人妻 美腿 | 亚洲精品成人av在线 | 蜜桃臀无码内射一区二区三区 | 中文精品久久久久人妻不卡 | 黑人巨大精品欧美一区二区 | 无码纯肉视频在线观看 | 亚洲日本va午夜在线电影 | 国产婷婷色一区二区三区在线 | 无码午夜成人1000部免费视频 | 正在播放老肥熟妇露脸 | 激情亚洲一区国产精品 | 丰满妇女强制高潮18xxxx | 伊人久久大香线蕉亚洲 | 国产色xx群视频射精 | 久久五月精品中文字幕 | 中文字幕无码视频专区 | 亚洲欧美色中文字幕在线 | 久久 国产 尿 小便 嘘嘘 | 久久国产精品萌白酱免费 | 欧美日韩在线亚洲综合国产人 | 亚洲天堂2017无码 | 国产在线aaa片一区二区99 | 内射爽无广熟女亚洲 | 精品久久久久香蕉网 | 国产办公室秘书无码精品99 | 国产av一区二区三区最新精品 | 秋霞成人午夜鲁丝一区二区三区 | 高潮毛片无遮挡高清免费 | 欧美 日韩 亚洲 在线 | 中文字幕无码热在线视频 | 18无码粉嫩小泬无套在线观看 | 丰满人妻翻云覆雨呻吟视频 | 丰满肥臀大屁股熟妇激情视频 | 天天躁日日躁狠狠躁免费麻豆 | 国产无av码在线观看 | 国产av剧情md精品麻豆 | 精品 日韩 国产 欧美 视频 | 久久久久成人片免费观看蜜芽 | 中文字幕乱码亚洲无线三区 | 天天躁夜夜躁狠狠是什么心态 | 大乳丰满人妻中文字幕日本 | 漂亮人妻洗澡被公强 日日躁 | 亚洲成在人网站无码天堂 | 国产成人一区二区三区在线观看 | 久久久久久九九精品久 | 又湿又紧又大又爽a视频国产 | 欧洲熟妇色 欧美 | 天堂久久天堂av色综合 | 久久久久免费精品国产 | 在线a亚洲视频播放在线观看 | 特大黑人娇小亚洲女 | 天堂在线观看www | 377p欧洲日本亚洲大胆 | 欧美精品免费观看二区 | 永久免费精品精品永久-夜色 | 大肉大捧一进一出好爽视频 | 一区二区三区高清视频一 | 久久97精品久久久久久久不卡 | 国产内射爽爽大片视频社区在线 | 97夜夜澡人人爽人人喊中国片 | 白嫩日本少妇做爰 | 成人三级无码视频在线观看 | 99久久无码一区人妻 | 少妇高潮喷潮久久久影院 | 国产精品美女久久久网av | 天天摸天天透天天添 | 国产人成高清在线视频99最全资源 | 无码福利日韩神码福利片 | 青春草在线视频免费观看 | 无码中文字幕色专区 | 欧美人与禽猛交狂配 | 秋霞成人午夜鲁丝一区二区三区 | 日本饥渴人妻欲求不满 | 亚洲国产午夜精品理论片 | 欧美人与物videos另类 | 性色欲情网站iwww九文堂 | 少妇性l交大片欧洲热妇乱xxx | 樱花草在线社区www | 国产偷国产偷精品高清尤物 | 人妻少妇被猛烈进入中文字幕 | 国产精品毛片一区二区 | 无码纯肉视频在线观看 | 国产精品久久久久久久9999 | 国产一区二区三区四区五区加勒比 | 欧美zoozzooz性欧美 | 露脸叫床粗话东北少妇 | 国产手机在线αⅴ片无码观看 | 精品 日韩 国产 欧美 视频 | 无码乱肉视频免费大全合集 | 精品国产福利一区二区 | 久久国产自偷自偷免费一区调 | 成人亚洲精品久久久久软件 | 两性色午夜视频免费播放 | 国内精品人妻无码久久久影院 | 好爽又高潮了毛片免费下载 | 无码纯肉视频在线观看 | 国产亚洲精品久久久ai换 | 久久久久久a亚洲欧洲av冫 | 欧美老妇交乱视频在线观看 | 99久久精品无码一区二区毛片 | 麻豆果冻传媒2021精品传媒一区下载 | 久久国产自偷自偷免费一区调 | 国模大胆一区二区三区 | 精品国产av色一区二区深夜久久 | 国产在线精品一区二区高清不卡 | 丰满人妻一区二区三区免费视频 | 国产精品久久久一区二区三区 | 少妇性荡欲午夜性开放视频剧场 | 乱码午夜-极国产极内射 | 乱人伦人妻中文字幕无码久久网 | 18无码粉嫩小泬无套在线观看 | 亚洲s码欧洲m码国产av | 中文精品无码中文字幕无码专区 | 成人无码精品1区2区3区免费看 | 国产艳妇av在线观看果冻传媒 | 在线亚洲高清揄拍自拍一品区 | 欧美日韩人成综合在线播放 | 一个人看的www免费视频在线观看 | 精品国产一区二区三区四区在线看 | 人人妻人人藻人人爽欧美一区 | 中文字幕久久久久人妻 | 日本丰满护士爆乳xxxx | 麻豆蜜桃av蜜臀av色欲av | 亚洲小说图区综合在线 | 成人欧美一区二区三区 | 欧美大屁股xxxxhd黑色 | 久久亚洲精品成人无码 | 少妇一晚三次一区二区三区 | 国产人成高清在线视频99最全资源 | 真人与拘做受免费视频 | 无遮无挡爽爽免费视频 | 国产精品香蕉在线观看 | 麻豆成人精品国产免费 | 亚洲色欲久久久综合网东京热 | 亚洲国产一区二区三区在线观看 | a片在线免费观看 | 97人妻精品一区二区三区 | 欧美人与禽zoz0性伦交 | 成人女人看片免费视频放人 | 国产精品免费大片 | 国产人妻精品一区二区三区不卡 | 奇米影视888欧美在线观看 | 日韩精品久久久肉伦网站 | 人人妻人人澡人人爽人人精品浪潮 | 亚洲色欲久久久综合网东京热 | 两性色午夜视频免费播放 | 成在人线av无码免观看麻豆 | 清纯唯美经典一区二区 | 蜜桃臀无码内射一区二区三区 | 免费看少妇作爱视频 | 亚洲一区二区三区含羞草 | 国产va免费精品观看 | 国产精品无码mv在线观看 | 内射欧美老妇wbb | 久久久久久久人妻无码中文字幕爆 | 成年女人永久免费看片 | 狠狠色色综合网站 | 午夜肉伦伦影院 | 国内揄拍国内精品少妇国语 | 一个人免费观看的www视频 | 青青青爽视频在线观看 | 国产成人精品视频ⅴa片软件竹菊 | 男女下面进入的视频免费午夜 | 国产内射老熟女aaaa | 欧美性生交xxxxx久久久 | 亚洲成熟女人毛毛耸耸多 | 免费看男女做好爽好硬视频 | 久久五月精品中文字幕 | 亚洲一区二区观看播放 | 日本护士xxxxhd少妇 | 亚洲熟悉妇女xxx妇女av | 欧美人妻一区二区三区 | 亚洲国产精品无码一区二区三区 | 国産精品久久久久久久 | 扒开双腿疯狂进出爽爽爽视频 | 久久综合久久自在自线精品自 | 亚洲gv猛男gv无码男同 | 一区二区传媒有限公司 | 久久国产精品二国产精品 | 欧美成人高清在线播放 | 色狠狠av一区二区三区 | 国产欧美精品一区二区三区 | 日本护士毛茸茸高潮 | 未满成年国产在线观看 | 18禁止看的免费污网站 | 国产亚洲精品久久久ai换 | 国产超级va在线观看视频 | 正在播放东北夫妻内射 | 亚洲精品鲁一鲁一区二区三区 | 十八禁真人啪啪免费网站 | 欧美日本免费一区二区三区 | 欧美日本精品一区二区三区 | 日本va欧美va欧美va精品 | 日产精品99久久久久久 | 国产亚洲人成a在线v网站 | 熟女俱乐部五十路六十路av | 欧美自拍另类欧美综合图片区 | 青草青草久热国产精品 | 欧美日韩在线亚洲综合国产人 | 国产乱码精品一品二品 | 亚洲国产精品一区二区第一页 | 亚洲中文无码av永久不收费 | 国产在线无码精品电影网 | 四虎影视成人永久免费观看视频 | 久久亚洲精品成人无码 | 永久免费精品精品永久-夜色 | 未满小14洗澡无码视频网站 | 亚洲中文字幕成人无码 | 人妻无码αv中文字幕久久琪琪布 | 午夜福利一区二区三区在线观看 | 国产精品香蕉在线观看 | 大乳丰满人妻中文字幕日本 | 免费国产成人高清在线观看网站 | 在线看片无码永久免费视频 | 国产电影无码午夜在线播放 | 99精品视频在线观看免费 | 国产激情一区二区三区 | 午夜精品久久久久久久 | 九月婷婷人人澡人人添人人爽 | 人妻插b视频一区二区三区 | 久久精品国产日本波多野结衣 | 亚洲精品一区二区三区四区五区 | 亚洲国产精品无码一区二区三区 | 在线播放免费人成毛片乱码 | 欧美一区二区三区视频在线观看 | 日韩视频 中文字幕 视频一区 | 亚洲а∨天堂久久精品2021 | 国产亚洲精品久久久ai换 | 亚洲国产欧美在线成人 | 欧美性猛交内射兽交老熟妇 | 2020久久超碰国产精品最新 | 欧美日本日韩 | 东京热一精品无码av | 亚洲经典千人经典日产 | а天堂中文在线官网 | 国产精品美女久久久网av | 日日摸天天摸爽爽狠狠97 | 国产艳妇av在线观看果冻传媒 | 国产无遮挡又黄又爽免费视频 | 中国女人内谢69xxxx | 无码精品国产va在线观看dvd | 日本欧美一区二区三区乱码 | 精品成人av一区二区三区 | 国产三级久久久精品麻豆三级 | 久久国产36精品色熟妇 | 国产suv精品一区二区五 | 少女韩国电视剧在线观看完整 | 男人扒开女人内裤强吻桶进去 | 欧美日韩视频无码一区二区三 | 国产一区二区三区四区五区加勒比 | 99国产精品白浆在线观看免费 | 性做久久久久久久免费看 | 中文亚洲成a人片在线观看 | 国产高潮视频在线观看 | 四虎永久在线精品免费网址 | 国产精品毛片一区二区 | 97人妻精品一区二区三区 | 国产精品美女久久久网av | 国产内射老熟女aaaa | 久久久久久九九精品久 | 国产精品视频免费播放 | 一区二区三区高清视频一 | 乱人伦人妻中文字幕无码久久网 | 色一情一乱一伦一视频免费看 | 精品人妻中文字幕有码在线 | 久久zyz资源站无码中文动漫 | 久久精品中文字幕一区 | 精品无码一区二区三区爱欲 | 97精品国产97久久久久久免费 | 欧美老妇交乱视频在线观看 | 大肉大捧一进一出视频出来呀 | 欧美老熟妇乱xxxxx | 欧美国产日韩亚洲中文 | 玩弄少妇高潮ⅹxxxyw | 久久视频在线观看精品 | 十八禁真人啪啪免费网站 | 亚洲日韩av一区二区三区四区 | 欧美人与禽zoz0性伦交 | 久久99精品国产麻豆蜜芽 | 亚洲精品成a人在线观看 | 亚洲一区二区三区无码久久 | yw尤物av无码国产在线观看 | 欧美黑人性暴力猛交喷水 | 中文字幕无码日韩欧毛 | 成熟女人特级毛片www免费 | 麻豆人妻少妇精品无码专区 | 日韩无码专区 | 国产麻豆精品精东影业av网站 | 图片区 小说区 区 亚洲五月 | 免费观看又污又黄的网站 | 草草网站影院白丝内射 | 夜夜高潮次次欢爽av女 | 国产美女精品一区二区三区 | 国产精品毛片一区二区 | a片免费视频在线观看 | 国产精品久久久久久久影院 | 成 人 网 站国产免费观看 | 亚洲一区二区三区含羞草 | 亚洲精品一区二区三区四区五区 | 成人免费视频视频在线观看 免费 | 少妇人妻大乳在线视频 | 青青青手机频在线观看 | 天天拍夜夜添久久精品大 | 亚洲熟妇色xxxxx欧美老妇y | 欧美成人午夜精品久久久 | 免费播放一区二区三区 | 成年美女黄网站色大免费全看 | 亚洲经典千人经典日产 | av在线亚洲欧洲日产一区二区 | 成人无码精品1区2区3区免费看 | 波多野结衣高清一区二区三区 | 综合人妻久久一区二区精品 | 日本欧美一区二区三区乱码 | 成人无码精品一区二区三区 | 亚洲爆乳大丰满无码专区 | 99久久99久久免费精品蜜桃 | 亚洲人亚洲人成电影网站色 | 久久天天躁狠狠躁夜夜免费观看 | 67194成是人免费无码 | 国产无遮挡又黄又爽免费视频 | 国产精品理论片在线观看 | 婷婷色婷婷开心五月四房播播 | 欧美亚洲日韩国产人成在线播放 | 久久综合香蕉国产蜜臀av | 国产免费久久久久久无码 | 丰满少妇高潮惨叫视频 | 国产人妻人伦精品1国产丝袜 | 亚洲精品中文字幕乱码 | 亚洲精品午夜无码电影网 | 少妇被粗大的猛进出69影院 | 久久久久人妻一区精品色欧美 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 国产精品亚洲专区无码不卡 | 国产综合久久久久鬼色 | 自拍偷自拍亚洲精品被多人伦好爽 | 亚洲日韩中文字幕在线播放 | 麻豆精产国品 | 无码人妻丰满熟妇区毛片18 | 亚洲国产av美女网站 | 狂野欧美性猛交免费视频 | 中文字幕无码免费久久9一区9 | √8天堂资源地址中文在线 | 久热国产vs视频在线观看 | 无码av岛国片在线播放 | 国产麻豆精品一区二区三区v视界 | 国产精品第一区揄拍无码 | 国产成人精品优优av | 国产亚洲精品久久久ai换 | 久久亚洲精品中文字幕无男同 | 婷婷五月综合缴情在线视频 | 亚洲午夜无码久久 | 国内少妇偷人精品视频免费 | 88国产精品欧美一区二区三区 | 亚洲中文字幕乱码av波多ji | 婷婷丁香五月天综合东京热 | yw尤物av无码国产在线观看 | 久久国产精品二国产精品 | 欧美人与物videos另类 | 熟女少妇人妻中文字幕 | 亚洲区小说区激情区图片区 | 久久久久亚洲精品男人的天堂 | 久久综合网欧美色妞网 | 国内揄拍国内精品少妇国语 | 爽爽影院免费观看 | 乌克兰少妇性做爰 | 精品久久久久久人妻无码中文字幕 | 免费观看又污又黄的网站 | 日日鲁鲁鲁夜夜爽爽狠狠 | 色诱久久久久综合网ywww | 久久99热只有频精品8 | 久久综合色之久久综合 | 成人毛片一区二区 | 国产舌乚八伦偷品w中 | 在线精品亚洲一区二区 | 丰满少妇高潮惨叫视频 | 日本一区二区更新不卡 | 国产成人综合在线女婷五月99播放 |