色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合av,久久激情五月丁香伊人

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

Linux fork函數(shù)詳解:返回值、COW寫時復(fù)制與僵尸進(jìn)程排查

Linux fork函數(shù)詳解:返回值、COW寫時復(fù)制與僵尸進(jìn)程排查 第一次看到fork這個函數(shù)我盯著那句“調(diào)用一次返回兩次”琢磨了挺久——一個函數(shù)怎么可能有兩次返回后來在內(nèi)核源碼里把kernel_clone到copy_process這條路走了一遍才算真正把這件事想通。它難懂不是因為概念有多玄乎而是因為它一腳踩在用戶態(tài) API 和內(nèi)核調(diào)度器的交界處你在 C 代碼里看到的只是一行函數(shù)調(diào)用背后卻是整個進(jìn)程地址空間的復(fù)制、頁表的重新登記、調(diào)度實體的插入。Linux 的 fork 函數(shù)幾乎是所有多進(jìn)程程序的起點從 shell 執(zhí)行命令、Nginx 拉起 worker、到你自己寫的批量任務(wù)分發(fā)腳本底層都是同一套東西。這篇文章我想寫給兩類人一類是剛學(xué)完操作系統(tǒng)課本、知道“fork 會復(fù)制進(jìn)程”但一寫代碼就蒙的同學(xué)另一類是在項目里被僵尸進(jìn)程、緩沖區(qū)重復(fù)輸出、子進(jìn)程不受控這些問題咬過、想把這套機制徹底捋順的開發(fā)者。我會從內(nèi)核實現(xiàn)路徑、返回值語義、代碼實操、參數(shù)取舍一路講到排查實錄代碼都能直接跑坑也都標(biāo)出來。1. fork 的本質(zhì)一次調(diào)用為何有兩次返回1.1 從用戶態(tài)看它只是三個整數(shù)之一從調(diào)用者角度看fork的接口簡單到幾乎沒有任何可配置項——沒有參數(shù)沒有任何 flag只返回一個pid_t。這個返回值分三種情況必須先記牢因為后面 90% 的 bug 都源于這里判斷錯了返回值出現(xiàn)在哪個進(jìn)程含義 0父進(jìn)程這個值是剛創(chuàng)建出來的子進(jìn)程 PID 0子進(jìn)程說明“我就是那個新進(jìn)程”沒有別的信息 -1父進(jìn)程創(chuàng)建失敗原因看errno有一點很容易被忽略子進(jìn)程拿到的 0 不是“子進(jìn)程的 PID 是 0”而是一個標(biāo)記位。子進(jìn)程想知道自己的 PID 得調(diào)getpid()想知道爹是誰得調(diào)getppid()。我見過不少人寫成if (pid 0) { /* 子進(jìn)程 */ }邏輯反了還不報錯程序在多核機器上跑出來的結(jié)果飄忽不定排查半天才發(fā)現(xiàn)是分支寫反。#include stdio.h #include unistd.h #include sys/types.h int main(void) { pid_t pid fork(); if (pid 0) { perror(fork); return 1; } else if (pid 0) { printf(child : pid%d ppid%d\n, getpid(), getppid()); } else { printf(parent: pid%d child%d\n, getpid(), pid); } return 0; }編譯就用gcc -Wall -O0 fork_demo.c -o fork_demo加-Wall是習(xí)慣編譯器對fork相關(guān)的返回值未檢查會給出提示能擋掉一批低級錯誤。1.2 內(nèi)核里那條路從系統(tǒng)調(diào)用到copy_process用戶態(tài)的一次fork()最終會落到內(nèi)核的sys_forkx86-64 上走_(dá)_x64_sys_fork再進(jìn)到kernel_clone。這個名字在不同內(nèi)核版本里變過老版本叫_do_fork5.x 之后統(tǒng)一成kernel_clone。真正干重活的是copy_process它按順序做了這么幾件事dup_task_struct復(fù)制一份task_struct和內(nèi)核棧此時父子進(jìn)程的描述符已經(jīng)存在但內(nèi)容還很“空”。一系列權(quán)限與配額檢查RLIMIT_NPROC限制、系統(tǒng)級線程數(shù)上限、用戶進(jìn)程數(shù)上限任何一項超了就直接返回錯誤。sched_fork給新任務(wù)初始化調(diào)度實體把它掛到調(diào)度器上但此時還沒真正運行。copy_files、copy_fs、copy_sighand這幾項大多是增加引用計數(shù)而不是深拷貝。打開的文件表、信號處理函數(shù)表、工作目錄這些父子共享同一份內(nèi)核對象。copy_mm這是最重的一步復(fù)制內(nèi)存描述符、遍歷所有 VMA、復(fù)制頁表并把父子雙方的頁表項統(tǒng)統(tǒng)改成只讀。alloc_pid分配一個新的 PID。wake_up_new_task把子進(jìn)程放進(jìn)運行隊列等調(diào)度器挑中它。父進(jìn)程在kernel_clone返回處拿到子進(jìn)程 PID子進(jìn)程不是“返回”到這個位置而是被調(diào)度到時從ret_from_fork這條棧幀直接跳回用戶態(tài)返回值寄存器被填成 0。所以“一次調(diào)用兩次返回”這個說法其實有點誤導(dǎo)——它不是同一個函數(shù)返了兩遍而是兩個獨立的執(zhí)行流各自從內(nèi)核態(tài)穿越回用戶態(tài)只是它們穿越前在同一段內(nèi)核代碼里待過。1.3 為什么不做全量拷貝COW 的取舍邏輯如果fork真的把父進(jìn)程幾百 MB 內(nèi)存整塊復(fù)制一遍那創(chuàng)建一個進(jìn)程的開銷會大到?jīng)]法用。早期的確是這個思路fork后緊跟execve的場景浪費極其嚴(yán)重——復(fù)制了一大堆馬上要被覆蓋的內(nèi)存。寫時復(fù)制Copy-On-Write簡稱 COW就是為了解決這個浪費copy_mm復(fù)制頁表時父子進(jìn)程的頁表項指向同一批物理頁只是把這些頁的權(quán)限位從可寫改成只讀同時在task_struct里把頁標(biāo)記成 COW 頁。真正的復(fù)制推遲到有人寫的那一刻。任意一方寫入觸發(fā)缺頁異常內(nèi)核發(fā)現(xiàn)這是個 COW 頁才分配新物理頁、把原內(nèi)容拷過去、改回可寫然后重新執(zhí)行那條指令。這個設(shè)計的精妙之處在于只讀的父子進(jìn)程幾乎零成本只有真正被修改過的頁才付出復(fù)制代價。但 COW 不是沒有成本。fork的耗時和進(jìn)程當(dāng)前占用的虛擬內(nèi)存成正比因為頁表本身要復(fù)制。粗算一下x86-64 上普通頁是 4KB一個占 1GB 內(nèi)存的進(jìn)程大約有 26 萬個頁表項每個 PTE 8 字節(jié)光頁表數(shù)據(jù)就是 2MB 左右再加上遍歷 VMA 的時間。所以你會發(fā)現(xiàn)一個現(xiàn)象——空進(jìn)程fork微秒級就完了幾百 MB 的服務(wù)進(jìn)程fork一次可能要好幾個毫秒。這個結(jié)論直接影響了后面的選型判斷。注意COW 讓父子共享物理頁但邏輯上是兩個獨立的地址空間。子進(jìn)程里的malloc返回值在父進(jìn)程里沒有任何意義別指望用這個地址跨進(jìn)程傳數(shù)據(jù)那需要共享內(nèi)存或者管道。2. 執(zhí)行流、競爭與繼承那些課本上不講清楚的事2.1 父子誰先跑答案是“不知道”fork返回之后父進(jìn)程和子進(jìn)程誰先被 CPU 執(zhí)行完全由調(diào)度器決定沒有任何順序保證。在多核機器上兩個進(jìn)程大概率是真并行在單核上時間片怎么分也看調(diào)度策略。這意味著任何依賴“父進(jìn)程先執(zhí)行完再輪到子進(jìn)程”的代碼都是錯的。我踩過的第一個坑就出在這里一個父進(jìn)程里 fork 之后立刻往共享的文件描述符寫數(shù)據(jù)子進(jìn)程也寫結(jié)果兩次實驗跑出來的內(nèi)容順序完全不一樣。當(dāng)時以為是文件系統(tǒng)的問題其實是執(zhí)行順序不確定。正確的處理方式是顯式同步——用waitpid等子進(jìn)程結(jié)束用管道通信用信號量互斥而不是靠“大概會先跑我”。#include stdio.h #include unistd.h #include sys/wait.h int main(void) { pid_t pid fork(); if (pid 0) { printf(child working\n); _exit(0); } int status 0; waitpid(pid, status, 0); printf(child exited, status%d\n, WEXITSTATUS(status)); return 0; }子進(jìn)程退出用_exit而不是exit這是個細(xì)節(jié)但很重要。exit會執(zhí)行atexit注冊的函數(shù)、刷新 stdio 緩沖區(qū)而這些緩沖區(qū)是從父進(jìn)程繼承來的如果父進(jìn)程 fork 前有沒刷新的內(nèi)容子進(jìn)程exit時又刷一遍輸出就重復(fù)了。_exit直接走系統(tǒng)調(diào)用跳過所有這些用戶態(tài)清理干凈利落。2.2 文件描述符繼承共享的不只是“編號”fork之后子進(jìn)程會得到父進(jìn)程所有打開文件描述符的副本但這里有個特別容易誤解的地方復(fù)制的是描述符不是文件對象。父子雙方各自的 fd 編號可能不同但它們指向同一個struct file而struct file里存著文件偏移量。后果很直觀父進(jìn)程讀了 100 字節(jié)子進(jìn)程接著讀會從第 101 字節(jié)開始而不是從頭讀。寫文件同理兩邊交替寫會互相覆蓋偏移。我在做一個日志切分的小工具時就被這個咬過父子都往同一個日志文件追加結(jié)果日志里出現(xiàn)了大片空洞——因為兩邊都在用lseek挪同一個偏移量。想避免這個問題常規(guī)做法是父子需要獨立讀寫位置時子進(jìn)程 fork 之后自己重新open一次文件或者應(yīng)用層用O_APPEND打開讓每次寫都由內(nèi)核原子地定位到文件末尾或者干脆別讓多個進(jìn)程寫同一個文件改成各自寫各自的后續(xù)再合并。除了文件描述符子進(jìn)程還會繼承當(dāng)前工作目錄、信號處理方式SIG_IGN和自定義處理函數(shù)都繼承但未處理的信號會重置為默認(rèn)、umask、環(huán)境變量、資源限制。這些在寫守護(hù)進(jìn)程的時候會集中爆發(fā)問題。2.3 多線程進(jìn)程里 fork 的隱藏雷區(qū)這是我認(rèn)為最需要單獨拎出來說的一條。fork只會復(fù)制調(diào)用它的那個線程其他線程在子進(jìn)程里全都不存在。但問題來了那些線程持有的互斥鎖、條件變量、讀寫鎖狀態(tài)是被原樣復(fù)制過去的。如果 fork 的瞬間某個鎖正被另一個線程持有那么在子進(jìn)程里這把鎖永遠(yuǎn)處于“被鎖住”的狀態(tài)而持有者已經(jīng)不存在了任何試圖加鎖的代碼都會永久阻塞。規(guī)避方式有三條路按推薦程度排fork 完立刻 execve。這是最安全的姿勢execve會把整個用戶態(tài)地址空間換掉鎖的狀態(tài)也一并消失。絕大多數(shù)“fork 后要干事”的場景其實都該走這條路。fork 之前保證沒有其他線程在跑比如在程序啟動早期就把需要 fork 的邏輯做完。用pthread_atfork注冊 prepare/parent/child 三個鉤子在 fork 前后手動加解鎖。這套機制能解決問題但很容易寫成死鎖尤其是涉及多把鎖的時候加鎖順序稍不注意就翻車。提示如果你的程序用了線程池同時又有 fork 子進(jìn)程的需求請優(yōu)先考慮把子進(jìn)程部分改成獨立進(jìn)程或者獨立的服務(wù)不要在同一進(jìn)程里混用。混用帶來的調(diào)試成本遠(yuǎn)高于拆開的改造成本。3. 動手實操從最小 Demo 到可用的進(jìn)程管理3.1 循環(huán) fork 的 2 的 n 次方陷阱先看一段看起來人畜無害的代碼for (int i 0; i 3; i) { fork(); printf(pid%d, i%d\n, getpid(), i); }很多人以為這會產(chǎn)生 3 個子進(jìn)程加 1 個父進(jìn)程。實際結(jié)果是 8 個進(jìn)程。原因在于fork之后父進(jìn)程繼續(xù)循環(huán)子進(jìn)程也從 fork 的下一行繼續(xù)執(zhí)行于是它也進(jìn)入下一輪循環(huán)并且再次 fork。每一輪都把當(dāng)前進(jìn)程數(shù)翻倍3 輪就是 23 8。這個行為本身沒錯是很多人對“子進(jìn)程從哪開始執(zhí)行”的理解有偏差。子進(jìn)程不是從main重頭開始而是從fork返回點繼續(xù)。如果確實需要創(chuàng)建 N 個并列的工作進(jìn)程比如預(yù)派生模型正確寫法是在子進(jìn)程里立刻跳出循環(huán)#define WORKERS 4 for (int i 0; i WORKERS; i) { pid_t pid fork(); if (pid 0) { perror(fork); break; } if (pid 0) { worker_loop(i); /* 子進(jìn)程干活不再進(jìn)入下一輪 */ _exit(0); } } /* 父進(jìn)程在這里統(tǒng)一 wait */關(guān)鍵就是if (pid 0)分支里干完活直接_exit絕不落回循環(huán)體。這個模式叫預(yù)派生pre-forkNginx 的 worker 模型、老式 Apache 的 prefork 都是這個思路。好處是每個 worker 獨立壞處是 worker 數(shù)在啟動時就固定了得配合平滑重啟來調(diào)整。3.2 用 fork execve 寫一個迷你 shell想真正理解 fork最好的練習(xí)是寫一個能跑命令的 shell。它的核心邏輯只有四步讀一行、切參數(shù)、fork、子進(jìn)程 exec。#include stdio.h #include stdlib.h #include string.h #include unistd.h #include sys/wait.h #define MAXLINE 1024 int main(void) { char line[MAXLINE]; while (fgets(line, sizeof(line), stdin) ! NULL) { line[strcspn(line, \n)] \0; if (line[0] \0) continue; if (strcmp(line, exit) 0) break; char *argv[64]; int argc 0; char *tok strtok(line, ); while (tok ! NULL argc 63) { argv[argc] tok; tok strtok(NULL, ); } argv[argc] NULL; pid_t pid fork(); if (pid 0) { perror(fork); continue; } if (pid 0) { execvp(argv[0], argv); perror(execvp); /* 只有 exec 失敗才會走到這里 */ _exit(127); } int status 0; waitpid(pid, status, 0); if (WIFEXITED(status)) { printf([exit %d]\n, WEXITSTATUS(status)); } else if (WIFSIGNALED(status)) { printf([killed by signal %d]\n, WTERMSIG(status)); } } return 0; }幾個值得說的點。execvp會自己去PATH里找可執(zhí)行文件所以直接敲ls就能跑。execvp成功的話永遠(yuǎn)不會返回返回值只在失敗時有用失敗后必須_exit(127)用 127 是 shell 界的慣例表示“命令沒找到”。waitpid拿到的status是個打包值不能直接當(dāng)退出碼用得用WIFEXITED、WEXITSTATUS、WIFSIGNALED這些宏去拆。我第一次寫的時候直接printf(%d, status)輸出 256 讓我困惑了很久——其實真實退出碼是 1因為退出碼存在高 8 位。這個 shell 還很粗糙不支持管道、重定向、后臺任務(wù)但骨架已經(jīng)對了。想支持管道就需要在 fork 之前先pipe()然后兩個子進(jìn)程分別把dup2把讀端寫端接到標(biāo)準(zhǔn)輸入輸出上這是個很好的練手項目。3.3 并行任務(wù)分發(fā)怎么定并發(fā)數(shù)再給一個更貼近實際工作的例子——把一批耗時任務(wù)拆給多個子進(jìn)程并行跑。這個模式在數(shù)據(jù)預(yù)處理、批量轉(zhuǎn)碼、壓測腳本里特別常見。#include stdio.h #include unistd.h #include sys/wait.h #define JOBS 4 static void do_work(int id) { sleep(1); /* 模擬耗時計算 */ printf(job %d done by pid %d\n, id, getpid()); } int main(void) { pid_t pids[JOBS]; for (int i 0; i JOBS; i) { pid_t pid fork(); if (pid 0) { perror(fork); pids[i] -1; continue; } if (pid 0) { do_work(i); _exit(0); } pids[i] pid; } for (int i 0; i JOBS; i) { if (pids[i] 0) { int status 0; waitpid(pids[i], status, 0); printf(child %d reaped, status%d\n, pids[i], WEXITSTATUS(status)); } } return 0; }并發(fā)數(shù)怎么定我的經(jīng)驗是別超過 CPU 邏輯核數(shù)。純計算型任務(wù)進(jìn)程數(shù)等于核數(shù)時吞吐最高再多只會增加上下文切換和內(nèi)存壓力??梢杂胹ysconf(_SC_NPROCESSORS_ONLN)拿到當(dāng)前可用核數(shù)再乘一個系數(shù)I/O 密集型任務(wù)等待磁盤、網(wǎng)絡(luò)系數(shù)取 2 到 4CPU 密集型任務(wù)系數(shù)取 1每個子進(jìn)程內(nèi)存占用大比如幾百 MB還得反過來壓低數(shù)量防止觸發(fā) OOM。另外要注意waitpid的回收順序。上面這段代碼是按創(chuàng)建順序回收的如果第 0 個任務(wù)特別慢后面三個早就跑完了也得等著。想做到“誰先完誰先回收”用waitpid(-1, status, 0)循環(huán)回收任意子進(jìn)程或者干脆用SIGCHLD信號處理。4. 資源、參數(shù)與選型什么時候該用 fork什么時候不該4.1 fork 失敗的兩種典型 errnofork返回 -1 時errno最常見的兩個值是EAGAIN和ENOMEM含義完全不同排查方向也不一樣。EAGAIN表示“資源暫時不夠”通常是進(jìn)程數(shù)配額打滿了。要檢查幾個地方RLIMIT_NPROC用ulimit -u看、系統(tǒng)級kernel.pid_max、kernel.threads-max還有 cgroup 里的pids.max。在容器環(huán)境里跑最容易撞的是 cgroup 的 pids 限制從宿主機上看一切正常容器里怎么都 fork 不出來。我遇到過的一次就是容器 pids 上限設(shè)得太小業(yè)務(wù)里但凡有個 fork 都失敗日志里只留一行“Resource temporarily unavailable”查了半天才定位到配額。ENOMEM則是內(nèi)存不夠。注意這不一定是物理內(nèi)存耗盡也可能是因為 COW 機制下內(nèi)核需要為新進(jìn)程分配task_struct和內(nèi)核棧同時在復(fù)制頁表時需要申請內(nèi)存。內(nèi)存緊張時一個本身不大的進(jìn)程 fork 也可能失敗。這時候該看的是dmesg里有沒有 OOM 相關(guān)記錄以及/proc/meminfo的CommitLimit和Committed_AS。堆棧上還有一個坑內(nèi)核棧默認(rèn)不大歷史上是 8KB某些配置下更小fork本身不占用戶棧但如果你的代碼在fork前遞歸很深子進(jìn)程復(fù)制的是整個地址空間的映射雖然 COW 不會立刻復(fù)制物理頁但虛擬地址空間的布局是完全一致的棧溢出風(fēng)險同樣被繼承過去。4.2 fork、vfork、clone、posix_spawn 怎么選這四個東西經(jīng)常被放在一起比較但它們的定位差別很大接口地址空間典型用途注意事項fork完全復(fù)制COW通用進(jìn)程創(chuàng)建大內(nèi)存進(jìn)程下耗時隨內(nèi)存增長vfork與父進(jìn)程共享父進(jìn)程阻塞fork 后立刻 exec 的老場景子進(jìn)程不能 return只能_exit或 execclone可精細(xì)控制共享哪些資源實現(xiàn)線程、命名空間隔離參數(shù)復(fù)雜直接用的場景不多posix_spawn內(nèi)部實現(xiàn)可能用 vfork/clone單純想“起個程序”接口受限不適合 fork 后跑自定義邏輯選型上的判斷其實很簡單如果你 fork 之后馬上就要 execve那就用posix_spawn它在 glibc 里會走clone(CLONE_VM | CLONE_VFORK)省掉整個頁表復(fù)制的開銷在大內(nèi)存進(jìn)程里差距非常明顯。我在一個占內(nèi)存接近 1GB 的服務(wù)里把fork exec換成posix_spawn創(chuàng)建子進(jìn)程的耗時從毫秒級降到了幾十微秒級效果立竿見影。如果 fork 之后子進(jìn)程要跑一段自己的 C 邏輯改環(huán)境、設(shè)權(quán)限、接著算那還是老老實實fork。vfork不要碰它的約束太苛刻稍微寫錯一點就是未定義行為而且現(xiàn)代 glibc 的fork已經(jīng)在很多場景下優(yōu)化得夠好了。如果你需要的是“共享地址空間的并發(fā)”那你其實想要的是線程應(yīng)該用pthread_create而不是clone。clone是給需要做命名空間隔離、實現(xiàn)容器運行時這類底層工具準(zhǔn)備的。4.3 內(nèi)存開銷的實測感受我自己做過一個粗略的對比測試在同一臺機器上讓一個進(jìn)程分別占用 10MB、100MB、500MB 匿名內(nèi)存然后各 fork 1000 次記錄平均耗時。數(shù)量級上的結(jié)論是10MB 時 fork 大約在幾十微秒100MB 時漲到一兩百微秒500MB 時到了毫秒級。這個增長主要來自頁表復(fù)制和 VMA 遍歷跟寫入多少數(shù)據(jù)無關(guān)。這個結(jié)論有很實際的指導(dǎo)意義如果你的服務(wù)常駐內(nèi)存很大就不要在熱路徑上頻繁 fork。要么改成常駐的 worker 池啟動時一次性 fork 好之后靠任務(wù)隊列分發(fā)要么改用線程池要么在 fork 前盡量減少不必要的內(nèi)存映射。反之如果進(jìn)程很小比如一個命令行小工具fork 的開銷基本可以忽略不用過度設(shè)計。5. 常見問題與排查實錄5.1 僵尸進(jìn)程不是“沒死透”是“沒人收尸”子進(jìn)程結(jié)束后內(nèi)核不會立刻把它的task_struct全部釋放因為父進(jìn)程可能還需要讀取退出狀態(tài)。這個狀態(tài)叫僵尸態(tài)Z。只要父進(jìn)程調(diào)用了wait或waitpid狀態(tài)被讀取資源才會真正回收。如果父進(jìn)程一直不回收僵尸會越積越多。單個僵尸占的內(nèi)存不多主要是一個task_struct加內(nèi)核棧但 PID 是有限的數(shù)量堆上去之后新的 fork 就會返回EAGAIN。用ps aux | grep Z能一眼看到或者ps -eo stat,pid,ppid,comm | awk $1 ~ /^Z/。處理方式有幾種按場景選同步回收waitpid(pid, status, 0)適合明確知道要等哪個子進(jìn)程的場合。異步回收注冊SIGCHLD處理函數(shù)在處理函數(shù)里循環(huán)waitpid(-1, NULL, WNOHANG)直到返回 0 或 -1。注意SIGCHLD可能合并所以必須用循環(huán) WNOHANG不能只 wait 一次。主動放棄如果確實不關(guān)心子進(jìn)程結(jié)果可以顯式忽略signal(SIGCHLD, SIG_IGN)在某些系統(tǒng)上這會讓子進(jìn)程退出時自動被回收不用父進(jìn)程操心。但要注意這會影響到所有子進(jìn)程其他需要waitpid的地方就拿不到狀態(tài)了。#include signal.h #include sys/wait.h #include unistd.h static void on_sigchld(int sig) { (void)sig; int saved_errno errno; while (waitpid(-1, NULL, WNOHANG) 0) { /* 循環(huán)回收所有已退出的子進(jìn)程 */ } errno saved_errno; } int main(void) { struct sigaction sa; sa.sa_handler on_sigchld; sigemptyset(sa.sa_mask); sa.sa_flags SA_RESTART | SA_NOCLDSTOP; sigaction(SIGCHLD, sa, NULL); /* ... 業(yè)務(wù)邏輯 ... */ return 0; }信號處理函數(shù)里保存和恢復(fù)errno是個細(xì)節(jié)因為信號隨時可能打斷正在進(jìn)行的系統(tǒng)調(diào)用處理函數(shù)里如果改了errno回到被打斷的地方邏輯就亂了。SA_RESTART的作用是讓被信號打斷的系統(tǒng)調(diào)用自動重啟減少EINTR的處理負(fù)擔(dān)。另一個容易被忽略的角色是孤兒進(jìn)程。父進(jìn)程先于子進(jìn)程退出子進(jìn)程就被“過繼”給initPID 1或者某些系統(tǒng)里的 subreaper由它負(fù)責(zé)回收。這本身不是問題但如果你的程序里子進(jìn)程依賴父進(jìn)程做清理工作父進(jìn)程一死子進(jìn)程就成了沒人管的野進(jìn)程。做守護(hù)進(jìn)程或者熱重啟的時候要特別小心這一點。5.2 緩沖區(qū)重復(fù)輸出一個經(jīng)典到不能再經(jīng)典的坑這段代碼把輸出重定向到文件你會看到兩行hello#include stdio.h #include unistd.h int main(void) { printf(hello); /* 沒有換行 */ fork(); return 0; }原因在于 stdio 的緩沖策略。輸出到終端時是行緩沖遇到\n才刷輸出到文件時是全緩沖緩沖區(qū)滿了才刷。printf(hello)沒有換行內(nèi)容就躺在用戶態(tài)緩沖區(qū)里沒發(fā)出去。fork復(fù)制地址空間時這份緩沖區(qū)內(nèi)容原樣復(fù)制到了子進(jìn)程。父子進(jìn)程各自正常退出exit觸發(fā)刷新于是同一個 hello 被寫了兩次。這個坑的隱蔽之處在于同樣的代碼在終端上跑是正常的一重定向到日志文件就出問題。所以排查時如果發(fā)現(xiàn)“日志里怎么有重復(fù)行”先看看是不是在fork前有沒刷新的輸出。規(guī)避手段很成熟fork之前調(diào)用fflush(NULL)把所有的輸出緩沖刷干凈或者子進(jìn)程一律用_exit而不是exit或者在每個printf后面老實加\n。這三條里我推薦后兩條組合使用_exit應(yīng)該成為肌肉記憶。5.3 常見問題速查表把上面這些以及一些零散的問題匯總一下方便對著查現(xiàn)象最可能的原因排查/解決fork返回 -1EAGAIN進(jìn)程數(shù)達(dá)到RLIMIT_NPROC或 cgroup pids 上限ulimit -u查容器 pids.maxfork返回 -1ENOMEM內(nèi)核內(nèi)存不足無法分配task_struct或頁表看dmesg、/proc/meminfo子進(jìn)程跑完不退出ps顯示Z父進(jìn)程未回收加waitpid或SIGCHLD處理日志出現(xiàn)重復(fù)行fork 前 stdio 緩沖區(qū)未刷新fork 前fflush(NULL)子進(jìn)程用_exit循環(huán)里 fork 出 2^n 個進(jìn)程子進(jìn)程落回循環(huán)子進(jìn)程分支結(jié)束后立刻_exit父子寫同一文件內(nèi)容錯亂共享文件偏移量用O_APPEND或各自 open或分文件子進(jìn)程里加鎖永遠(yuǎn)阻塞多線程下 fork鎖被其他線程持有改成 fork 后立即 exec或用pthread_atfork子進(jìn)程變成孤兒無人清理父進(jìn)程先退出用 subreaper 或?qū)iT的 supervisor子進(jìn)程繼承了不該有的 fdfd 默認(rèn)被繼承fork 后關(guān)閉無關(guān) fd或用O_CLOEXEC最后一條值得展開說一句。O_CLOEXEC這個標(biāo)志非常有用打開文件或套接字時帶上它這個 fd 會在 exec 時自動關(guān)閉避免子進(jìn)程意外持有不該持有的連接。在長連接多的服務(wù)里如果 fork 出來的子進(jìn)程繼承了所有 socket一方面浪費 fd另一方面連接關(guān)閉的時機變得難以判斷。從代碼層面統(tǒng)一給open、socket、pipe2加CLOEXEC是個好習(xí)慣成本幾乎為零。還有一個排查技巧不確定子進(jìn)程到底繼承了哪些 fd可以在子進(jìn)程里ls -l /proc/自進(jìn)程PID/fd一眼看清楚。同理/proc/PID/status里的Threads、VmRSS/proc/PID/task/下的線程列表都是排查這類問題的一手信息。養(yǎng)成看/proc的習(xí)慣比裝一堆工具快得多。6. 我在實際項目里攢下的幾條經(jīng)驗寫到這里分享幾個文檔里不太會提、但確實節(jié)省過時間的做法。第一給每個 fork 出來的子進(jìn)程起個可識別的名字。Linux 上可以調(diào)prctl(PR_SET_NAME, worker-xxx)這樣ps和top里就能看明白哪個進(jìn)程在干什么而不是一堆同名進(jìn)程排在那。出問題時省下來的定位時間遠(yuǎn)超當(dāng)初寫這幾行代碼的成本。第二在子進(jìn)程的入口處打一行帶 PID 的日志并且立刻setpgid或調(diào)整會話。這能讓日志里的 PID 和進(jìn)程樹對應(yīng)起來尤其是在子進(jìn)程會再 fork 的場景下沒有這層標(biāo)記日志會亂成一鍋粥。做后臺任務(wù)的時候順手把子進(jìn)程放到獨立的進(jìn)程組后面想整組發(fā)信號終止也方便。第三不要吝嗇waitpid的循環(huán)寫法。我見過太多“只 wait 一次”的代碼在子進(jìn)程密集退出的場景下漏回收慢慢積累成僵尸。統(tǒng)一寫成while (waitpid(-1, st, WNOHANG) 0)配合SA_RESTART這套模板可以直接抄。第四大內(nèi)存進(jìn)程優(yōu)先考慮換掉模型。如果發(fā)現(xiàn)每次 fork 都有明顯卡頓先別急著調(diào)內(nèi)核參數(shù)問問自己“這個 fork 真的必要嗎”。預(yù)派生進(jìn)程池、線程池、獨立的常駐服務(wù)這三種方案在絕大多數(shù)場景下都比“按需 fork”更穩(wěn)。fork這個接口看著古老但它承載的語義——地址空間復(fù)制、文件描述符繼承、執(zhí)行流分叉——至今沒有被替代。把它的返回值、COW、回收機制這三件事吃透后面再看clone、看容器運行時怎么隔離命名空間、看 shell 怎么執(zhí)行管道都會順很多。我現(xiàn)在寫涉及多進(jìn)程的代碼開工前會先在紙上畫一遍父子關(guān)系標(biāo)清楚哪個 fd 誰負(fù)責(zé)關(guān)、哪條路誰負(fù)責(zé) wait畫完之后 bug 就少了一大半。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
亚洲天堂资源网| 欧美99热| 激情小说亚洲| 9美女超碰在线免费观看| 激情五月婷婷| 再深点灬舒服灬太大了好硬好爽| 国产高清吃奶免费视频网站| 啪啪自拍九九综合| 91丰满| 欧美天堂在线| 婷婷久草| 97久久久久久久久久| 综合久欧洲| 国语人妻精彩刺激| 激情四射婷婷四五月天| 白丝1区2区3区| 婷婷五月天AV| 啊啊啊操一区| 超碰97在线 欧美 国产| 伊人久久国产免费观看视频| 97超碰护士| 国产AV天美传媒一区二区三区 | 亚洲第一在线视频| 久久黄色视频一区二区三区| 国产美女裸体秘 永久无遮挡| 久久精品国产亚洲av水密被窝| 久久久内射良家| 欧美丝袜美女电影一二三四区| 久久综合女优| 九热超碰| 国产美女高潮| 精品无码久久久久久国产浪潮| a男人的天堂久久一级A毛片| 欧美亚洲素人制服精品| 国产精品无码AV网站| 九九色精品| 天天91~综合入口| 伊人久久国产免费观看视频| AV男人天堂网| 欧美性爱18观看| 福利伊人玖玖国产| 偷窥自拍亚洲色图| 人妻美腿丝袜日韩| www99热| 久久男女激情视频网站| 有码免费观看| 伊香蕉综合久久久久久久噜噜噜 | 91热色| 中文字幕激情小说| 综合欧美激情网| 丁香五月婷婷五月| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 人人操AV| 国产一| 免费看美国人人爽,人人操| 熟人人妻少妇精品久久| 九九无码| 99精品综合久久久久五月天| 天天懆天天日| 荡小穴在线观看| 久久精品人妻一区二区三区| 日韩性爱毛片操骚逼| 久久激情网| 老汉网| 精品国产Av无码久久久伦古装| 国产高清午夜成人在线观看| 日本天天操| 玖玖综合视频| 日本一级一级一级一级| 天天操天天干一区二区| 国产伊人自拍| 很很操在线| 人妻夜夜爽天天爽麻豆三区网站 | 亚洲va综合va国产va中文| 偷拍在线观看视频| 蜜乳av一区二区| 五月天综合网| 最新中文字幕精品在线| 九九久久国产精品怡红院| 成人午夜小视频手机在线看| 伊人视频| 久久久一区二区三区四曲免费听 | 国产一区二区在线电影| 天美传媒精品久久视频| 色性综合| 乱伦a片视频| 国产久久一区二区| 丁香六月婷婷久久综合| 欧美色女人| 伊人久久大香蕉线AV五月天| Blackedraw视频一区二区| 91黑丝露脚| 亚洲巨爆乳一区二区三区四季网| 欧美精品四区| 大香网站| 97在线免费观看| 97香蕉人人乳| 国产成人综合网| 2025年A片视频精品| 欧美天堂亚洲电影院一区在线播放| 中日亚韩免费视频| 久久久久久精| 后入日本1234| 国产欧美日韩臀| 国产精品三级视频网站| 日韩免费福利在线观看| 亚州色综合| 国产一区二区久久| 黑人中出21连凳花野真衣| 福利色色| www成人啪啪18秘 免费| 一个国产在线综合网站| 91亚洲综合| 亚洲综合大片| 久草精品一区| 欧美色图人妻| 九9热伊人| 97内射偷拍| 91大学精品激情戏| 看一级黄色视频| 中文字幕奈奈美被公侵犯| 日韩91网| 无人区高清电影免费观看一区二区三 www.qmcai2.com | 五月婷婷影院| 亚洲天堂区| 婷婷午夜| 精品一区二区啪啪啪| 牛牛aV| 在线免费观看日韩一区| 人人艹亚洲| 美女久久久久久久| 九九九九热| 男人久久精品| 嗯,啊。舔我逼| 日本中文字幕一区| 亚洲欧美天| 久久风骚城市| 极品另类| 超碰在线观看av不卡| 另类小说综合网| 韩国成人精品久久久免费看| 午夜久久无码1000合集| 97操碰| 天堂九九九九九九九九九| 色呦呦、国产精品| 校园春色综合色| 啊啊啊97视频| 中文字幕97色| 久久9精品| 五月婷亚洲精品天堂| 国产精品精品系列在线观看| 少妇一级婬片免费放一级a性色.| 精品国产乱码久久久久久口爆网站| 91成人精品在线播放| av凤凰久久久| 欧美日韩婷婷中文| 香蕉99秘 一区精品蜜桃臀| 国产高清视频无码在线| 丁香五月婷婷基地| 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 淫妻综合网| 欧美 亚洲 大香| 99色在线| 色综合天天| 亚洲不卡AV在线| 亚洲清纯唯美| 亚洲无码成人精品| 日本久操视频| 亚洲人久久久久日| 久久久专区| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 在线女人91| 熟妇女伦乱视频视频| 日韩免费中文字幕视频| 农村妇女一级二级三级视频| 久草线上视频免费看| 无码操逼视频一下| 亚洲人在线成线成人| 午夜精品久久久久久久第一页按摩| 岛国片在线播放| 狠狠狠一区二区三区| 亚洲天天自拍| 九九精品热| 四虎免费在线播放| 性色av网站| 蜜桃AV天堂| 97超碰色中文字幕| 国产美女自拍AV| 久久国产精品一级二级三级| 嗯嗯啊啊啊好爽| 嫖老熟女A片一二三区| 中国黑人三级片网站上区| 九九热三级片| 欧美超碰9798| 青青在线视频日韩欧美| 亚洲高潮少妇| 熟女人妻一区二区三区| 欧美白嫩女HD| 国产女人高潮嗷嗷嗷叫小说| 又摸又舔在线观看网站| 人人操人人干网页| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 玖玖爱一区在线| 中国一级αV| 亚洲av总站| 大JI巴好深好爽又大又粗视频| 91丝袜美女国产| 1区2区3区视频| 99热99re超碰精品| 熟女字幕| 国产精品久久泡妞网站| 青青草日韩无码| 久久激情婷婷| 91夜夜蜜桃臀1区2区3区| 天天综合色图| 韩国轻伦国内自拍一区| 国产乱伦性爱区| 96国产污污污丝袜| 99综合视频一体| 狠狠爱大香蕉| 97天天做| 亚洲中文日韩精品| 日日超碰亚洲| 婷婷久草| 天天爽天天爽| 2017av无码免费无线播| 久久久久斤小| 六月激情网| 国产无吗在线播放| 国产精品电| 密桃99999| 黄色AV免费| 国产中文福利| 骚逼高潮久久精品| 岛国色情视频在线观看| 中国韩国明星一极片一区乱码毛片人妻熟女一区二区三区 | 欧美淫穴| 国产女人操逼视频| 91第一页| 粉嫩av一区二区三区四季| 国产99 中文字幕日韩小视频| 91第一页| 色综合 加勒比| 99热精品在线| 亚洲国产高清福利视频| 午夜精品久久一区二区| 韩国嫰模上门援交视频| 天天操狠狠日夜夜干超碰撸com视频在线观看| 日本人妻丰满熟妇久久久久久| 色臀aV| 色色亚洲| 成人八戒网站| 黄视频免费| 久久久久女教师免费一区| 99re95| 日韩午夜啪啪视频| 乱伦a片视频| 91天堂网| 人妖欧美一区二区| 中文字幕88av在线| 日韩pv中文| 欧美性爱系列| 女人被添高潮免费视频| 亚欧免费| 日韩有码 一区二区三区| 国产精品白丝AV| 宗合情欲网| 五月婷婷综合网| 日韩国产成人自拍视频| 欧美熟妇成人一区二区| 亚洲无线观看久久| 97视频免费播放| 91N综合网在线| 神马久久69| 国产精品制服丝袜中文字幕日韩一区二区三区 | 欧美日韩小说| 四虎影视永久在线观看精品免费网站| 91丝袜激情在线| 黄页大片在线观看| 夜夜夜久久| 另类天堂| 激情深爱五月天| 看日韩操逼| av在线免费一区二区| 蜜乳AV免费观看| 精品视频一区二区| 九九久久精品| www.久久爱| 国产又色又爽又舒服的三级视频| 成年人一级黄色毛片大全在线观看| 国产Av超碰| 国内毛片热久久思思热| 欧美精品精品一区二区| 三级日本一区二区三区| 成人97人人超碰人人| 日韩激情电影中文字幕| 国产乱伦性爱区| 免费一级精品啪啪视频| 亚洲成?V人片在线观看福利| 91动漫操逼视频| 在线综合色| 国产精品爽爽va在线观看98| 思思热免费视频观看| 日本一级二级三级网站| 夜色AV无码手机在线影院| 亚洲砖码砖专无区2023| 99热亚洲| 台湾佬中文娱乐自偷自拍| 日日夜夜骚| 日本欧美色| 一区二区三区色综合| 亚洲日韩欧美一区二区| 久艹99| 一卡二卡三卡| 国产传媒日韩| 嫩草美女久久| 日韩探花精品在线视频| 色噜噜综合网| 国产有码一区| 国偷自 一区| 日本大香蕉综合网红本杳社区| 亚洲天堂2020| 少妇人妻太紧太深av| 日韩免费看黄片| 激情婷婷五月天| 特级大荫道BBwBBwBBW| 一区 欧美 日韩 麻豆| 天天拍天| 91综合在线| 国产欧美精选激情视频| 伊人影院中文字幕| 久久久久久久久久久久久久久久9| 超碰一区二区| 久久性爱视频免费看| 亚洲免费成人在线高清无码视频| 可以看的av| 亚洲色图国产另类| 中文字幕乱码在线观看| 日韩AV无码中文一区二区| 99色在线| 亚洲天堂少妇| 亚洲国产成人7777| 99久热| 欧美夜夜骑视频| 欧美,日韩,中文,另类| 欧美日韩插逼视频| http://qxhbdz.com| 亚州九九九精品视频| 91啪啪| 亚洲欧洲国产综合av| 免费的av网| 九九九国产精品| 国产福利视频精品视频| 伊人91| 秋霞鲁丝午夜无码一区二区三| 人妻精品一区二区三区| 国产精品麻豆视频网站| 黄色乱论网站| 啊啊啊啊操死我| 国产精品探花视频| 日本东京热大香蕉a片| 成人小电影网站tex| 一,爱啪啪,在线免费视频| 久久久9视频| 亚洲高清色综合| 国产精品岛国片在线观看| 不卡九肏| 免费a v| 久热91| 青青草日韩免费观看高清在线| 国模无码人体一区二区三| 五月激情视频| 91情色在线| 日本熟女中文| 久久风骚城市| 久久6热视频免费观看| 黄色十八禁网站| 网站A V在线| 日本久操视频| 欧美乱伦专区| 中文字幕日韩人妻视频一区二区三区交换夫妻 | 色五月婷婷网| 欧美综合色,www| 去干网最新版| 91操熟女视频| 99热综合| 欧美日韩在线小说 | yy少妇精品久久| 波多野结衣一级视频| 性色中出| 久综合国内精品自在自线| 蜜臀久久99精品久久久久免费观| 韩国免费播放一级毛片| 色婷婷成人综合| 电家庭影院午夜69久久夜色精品国产69乱 | 无遮挡又黄又刺激的视频| 国产亚洲 中文欧美久久| 999精品乱码| 日韩有码一区三区| 亚洲无码国产探花在线观看| 少妇与黑人高潮在线| a男人的天堂久久一级A毛片| 国产十八禁视频| 日本视频一区二区三区| 国产AV天美传媒一区二区三区 | 手机av天堂久久久久| a'v在线资源| 动漫片子网站3黄| 97在线精品观看视频| 东方亚洲在线操逼天堂| 99色婷婷| yaouchengrenav| 乱码熟妇人妻久久久| 国产人妖的免费的视频| 97视频在线观看网站| 激情五月天社区| 伊人网高清| 久艹伊人精品综合在线| 黄色视频特级毛片| 久久久91| 蜜桃视频一区二区三区 | 日韩免费福利在线观看| 亚洲丝袜制服国产91_国语字幕免费观看完整版下载第5集_ | 91成人无码| 一区麻豆 高清中文字幕| 中文字幕一区二区日韩网| 天天干夜夜肏| 91扒丝袜综合在线| 免费黄色A片| 97视频免费播放| 欧美精品双插| 婷婷五月天综合网| 国产女人操逼视频| 中文乱码字字幕在线第5页| 一区二区视频你懂的| AAA久久| AV一起草在线| 啊啊在线| 亚洲视频一二区| 激情综合久久| 国产欧美日韩精品中文| 人人么人人操| 欧美日韩狠狠爱| 成人热久久精品| 噜噜在线| 久久久久成人亚洲国产| 翔田千里无码一区| 99av| 美女天天干| 欧美日韩国产电影| 五月天春色激情网| 中文激情网| 欧美国产精品| 日本爽爽爽爽爽爽免费视频| 麻豆视频一区二区| 99热欧美| 日韩中文9| 国产一级久久久| 猛交交| 抽插无码高清一区| 亚洲欧洲精品视频发布| 逼操网站| 一本久道在线综合视频| 天天干人人看综合| 97超碰欧美手机| 自拍啪啪视频| 天天在线91| 少妇专区一二三四五| 啊啊啊好湿国产一二| 开心五月天激情网| 天天做天天爱| 亚洲第一综合| Julia在线播放亚洲久久| 99热这里只有精品地址| 在线精品福利免费播放| 国内毛片国产专区二| 精品人妻中文字幕4399| 韩国手机不卡无码三级视频| 高清国产无码av| 老司机福利青青草| 搡老女人911熟妇老熟女| 麻豆精品一区二区三区四区免费观看| 综合 亚洲 欧美| 啊v在线观看视频| 精精品人妻一区二区三区| 9美女超碰在线免费观看| 999久久芭蕾| 人妻蜜桃臀| 精品熟妇视频一区二区| 人妻熟女一区二区三区视频| 欧美亚洲手机在线| 草草电影院| 亚洲人妻中文在线视频| 在线岛| 97在线精品观看视频| 欧美丰满少妇xx高潮| 人干人人人操人人摸| 激情无码日韩| 思思热免费视频观看| 久久性爱城| AA丁香综合激情| 欧美第一页性| 麻豆天美传媒在线视频天堂| 强奸熟女一区二区三区| 精品十八在线观看| 久久久久久精| 在线视频免费播放一区| 久热九九| 中文字幕在线观看网页| 亚州综合AⅤ| 死我十八禁| 精品国产乱码久久久A| 麻豆久久精品亚洲精品88| 欧美一级AAAAAAA| 亞洲久久直播| 色妺妺在线视频| 国产超碰在线一区| 97 国产精品| 日韩兔费看黄片| 精品亚洲国产成人精品| 天天日天天舔天天喷天天射| 99re69| 另类图片五月天| 中文字幕丰满人妻日本| 加勒比久久综合网高清| 免费夜夜爱黄色视频毛片| 天天舔九色婷婷| 亚洲欧美校园| 正在播放国产精品一区| 色99在线| 9长久久精品| 亚洲人妻爽爽爽| 无码丰满熟妇一区二区浪潮AV| 免费在线观看AV无码网站| 热天堂一区二区| 熟女熟妇伦久久影院毛片一区二区| 精品97久久| 性色生活片久久毛片婬片免费放女人一级毛片 | 日韩肏逼视频| 欧美精品自慰系列寂寞少妇| 97在线欧洲| 精品人妻一区二区三区四区| 久久久久亚洲av综合波多野制衣| 激情丁香五月| 精品熟妇视频一区二区| 国产精品嫩草影院午夜两性 | 国产黄色影片在线观看| 超碰久久中文| 亚洲国产97在线精品一区| 欧洲欧美视频一区二区| 热久久91婷婷| 亚洲动态色图| 九九综合久久| 99热线麻豆 | A一区片| 一区二区三区精品黑丝白丝酒店对鸡 | 久久婷婷热| 97频视在线| 国产精品无码成人精品| 97色插| 男人综合网| 久久久国产三级黄色片| 久久九操在线观看| 青娱乐国产精品| 97视频在线观看高清资源| 久9无限国产| 久久婷五月| 中文字幕免费在线观看| 亚洲aV性爱| 激情久久日韩精品中文字幕麻豆| 日韩人妻一二三区视频| 欧美青青视频| 国产福利在线视频网站| 久久精9| 亚洲男人久久综合天堂| 欧美亚男人的天堂| 黄色免费网| 久久一二区四| 亚洲熟女乱色一区二区三区| 久久久久久久久久久久久久久乱码 | 熟妇一区二区三区| 一级婬片120分钟试看| 艾草av| 亚洲人妻中文在线视频| 91国产大片| 国产精品嫩草久久久久| 亚洲 另类 丝袜 自拍 动漫| 操逼片国产| 亚洲。天堂。日本在线观看| 久久久免费一级黄片| 99热这里只有精品1| 在线国产探花| av天堂电影网| 97超碰热线| 日韩激情小说一区二区| 九九免费影片| 五月激情综合网| 午夜性刺激视频免费观看| 天天摸夜夜摸| 精品人妻一区二区视频| 97久久久久久久久久| 色婷五月天| 性色AV蜜色av色欲av| 久久爽爽精品| 日韩黄色成人性爱| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 九九九九精品视频| 日本少妇va7777| 欧美日本中字另类在线| 精品国产乱码久久久影院| www.色婷婷| 国内毛片国产欧美拍| 嗯嗯嗯啊啊啊干死我吧| 99亚洲天堂| 久久中文字幕不卡人妻| 97超碰中文字幕| 乱精品一区字幕二区| 久草尤物| 色婷婷日韩精品一区二区三区| 亚洲人妻一区二区三区| 中国一级操逼视频| 亚洲 欧美综合| 国产精品色哟哟| 亚洲免费看片| 国产精品蜜臀久久久久无码AV| 伊人嫩草| 91久久久视| 天天插天天射| 嫩草一区二区在线观看| 亚洲国产精品成人久久蜜臀| 亚洲系列欧美| 国产超碰在线一区| 青青草操逼逼视频| 国产一区二区精品久久99| 蜜臀久久99精品久久久久久婷婷| 日韩精品怡红院| 日本熟妇一区二区三区| 日韩欧美一级特黄大片| 日本人妻最新在线中| 97视频在线观看网站| 亚洲人在线| 天天综合网站| 新婚人妻扶着粗大强行坐下| 在线播放成人高清免费视频| 欧美 色 亚洲| 锕锕好爽 死我在线观看| 亚洲乱色视频一区、二区在线| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 99色热国产视频精品| 亚洲国产精品成人久久蜜臀| 丝袜视频网国产90| 91操人| 亚洲永久AV无码精品秋霞| 亚欧性爱ab| 中文字幕在线免费观看 | 国产AV久久野战精品| 91色综合| juliaann欧美丝袜办公室| 中国熟女网站| 国精综合一二三区影视| 亚洲熟女国产综合另类| 激情五月综合网| 中文字幕一区日韩精| 狠狠色狠狠色狠狠五月| 香蕉久久AⅤ...| 亚洲一区操| 亚洲欧美国产中文视频| 黄骗免费网站| 91内射| 久久91| 欧美一二三| 久久超碰com| 熟妇人妻精品一区二区| 91观看 国产白丝| 中国和日本人色哪个不下载能放| 成人情色综合网| 亚洲熟妇白浆无码AV| 国产成人啪一区二区| 99热日| 欧美精品,四区。五区| 久操影视| 超碰 欧美| 91麻豆天美国产欧美高潮| julia ann久久| 亚洲成人在线资源| 欧综合网| 亚洲情色综合| 91被操| 家庭乱伦国产| 大黄片做爱的大的| 亚洲精品一区二区三区在线播放| 色综合久久88色综合久久天天| 日韩乱中文| 岛国片在线观看视频亚洲| 九九色热| 国产伦精品免编号公布| 熟妇人妻一区二区| 好舒服视频| 天天天做天天天爱天天天爽| 噜噜噜噜久久久精品免费| 97欧美在线| 亚洲 欧美 日韩 国产一区二区 | 亚洲欧美在线丝袜| 偷拍精品一区二区三区| 青青青国产手线观看视频2| 中文字幕AV乱伦| 中文字幕亚洲热播人妻| 日本片日本片祼观看网站在线看中文版网页在线看 | 精品999一区二区| 日韩无码极品| 无码操逼网| 柠檬AV导航| 免费看污网站| 久湿久久| 欧美色宗合| 日韩激情啪啪啪| 99热免费| 婷婷五月天无码| 99re这里只有精品2| 九九九九热| 综合在线导航一区| 婷婷五月在线视频| 狠狠热这里都是精品| 亚洲诱惑天堂 | 91欧美网| 国产日产精品久久快鸭的功能介绍| 国产精品自拍欧美在线| 亚洲 91 在线| 亚洲中文字幕一区| 一级性爱视频免费观看| www.人人cao| av在线浏览| 亚洲 中文 欧美 日韩 在线| 精品一区二区三区国产| 人人干人人搞人人摸| 亚洲乱色视频一区、二区在线| 亚洲AV色图一区| 性色AV蜜色av色欲av| 深田咏美亚洲精品福利社| 高清不卡一二三区视频......| 四虎免费视频| 国产视频一区二区三区在线免费观看| 久9视频| 精品人妻一区春色| 极品色| 亚洲色欲天天人妻无码系列专区| 欧美白嫩女HD| 久操97| 曰韩无码777| 成熟熟女国产精品一区二区| 欲香欲色| 日韩人妻资源在线看| 婷婷九月国产| 草草影院日本第一页| 亚洲精品久久久久久久久豆丁网| 99最新日韩偷拍视频| 午夜激情成人在线观看 | 操逼视频免费日韩无码| 丝袜视频一区二区在线播放国产中文| 久久激情婷婷| 26uuu国产| 久久有码视频| 操逼操操操91| 九九超碰综合网| 欧美另类综合久久| 中文字幕AV片| 亚欧性爱无码| 91九九九小逼| 日本色色视频网站| 2019天天操天天爽天天拍| 日韩性爱啪啪视频| 人妻密肉在线观看| 国产精品内射婷婷一级二| 性欧美另类高清| 欧美色涩| 人妻精品综合中文字幕在线 | 九99久久| 在线观看日韩av不卡| 欧美激色| 日韩性爱高清免费视频| 伊人四虎综合| 台湾大香蕉99热| 久久精品 六十路 熟女 欧美| 射丝袜高跟鞋99| 青娱乐淫乱1314| 成人无码专区精品视频| 午夜视频久久久久一区| 日韩国产十八禁| 日韩无码三级影院| 97se综合| 亚洲天堂 视频你懂的| 欧美91网| 国产人妻精品久久久一区二区三区 | 欧美东京热青青草| 水澄无码AV| yaouchengrenav| 婷婷香网站| 免费强奸av| 蜜臀99久久国产| 99热超碰| 久久无码成人| 日本97久久| 久久一二三四五六七八九区区区 | 亚洲国产高清福利视频| 大香蕉人妻久久| 久久久精久久久| 亚洲国产尤物yw在线观看| 欧美色图片欧美色图| 亚洲色色色| 国产JDAV无码视频在线观看| 欧美少妇性乱| 探花激情视频| 懂色Av| 免费成人在线熟妇网| 色香色欲天天综合网天天来吧| 97欧美日韩综合| 美女久久久久久久| 久久精视频美日韩在线视频| 热热色91| 久久99精品九九久久久婷婷| 亚洲AV无码成人精品久久| 九九九九AV| 无码人妻精品一区二区三区九九| 亚洲丁香花色| 欧美日韩午夜精品一区二区三区| 狠狠爱夜夜干| 青娱乐亚洲热| 国产剧情AV不卡在线观看| 97狠狠| 亚洲天堂日本| 亚洲精品色| 狼狼色丁香久久婷婷综合五月| 青娱乐黄色录像| 日本黄色裸日本黄色裸体| 超碰AV在线| 尤物黄色在线观看网站| 97超碰9| 蜜屁Av| 天天舔天天| 18禁的网站在线| 国产高清午夜成人在线观看| 欧美丰满少妇交换91欧美精品| 一区,二区,三区网站| 亚洲最大无码中文字幕网站| 中文字幕第9页萱萱影音先锋| 啊啊啊男女| 亚洲第91页| 麻豆亚洲Av成人无码一区精品| 无码高清专| 国产精品ⅴ无码大片在线看.| 东京热91| 激情四射婷婷六月天| 超碰1024久久| 九九精品美女高溯喷水| 97干在线视频| 最新国产亚洲精品精品国产亚洲综合 | 97精品国产手机| 国产女人高潮视频| 九九性爱网| 啪一啪免费视频| 香蕉热人人精品| 成人a v在线播放免费| 久久久久99999| 啊啊啊慢点| 人人澡人人澡人人| 99re综合伊人| 老女人91| 久久同城AV| 神马久久久久久久久久久久| 嗯嗯啊啊啊好舒服| 丰满翘臀美女影院视频| 日韩人妻资源网| 密桃99999| 狠狠穞A片一區二區三區| 九九综合久久| 久久男女激情视频网站| 亚洲色图亚洲无码强奸乱伦| 999亚洲国产视频| 园内精品自拍视频在线播放| 亚洲精品一区二区精品| 国产日韩无码一区二区三区久久区| 1240青青草一区二区三区视频天爱| 亚州欧美另类| 久热这里只有精品9| 超碰97久| 亚洲美女精品九九视频| 97鸡把在线视频| 亚洲熟女诱惑| 超碰色综合| 狠狠操,使劲操| 无码精品久久| 欧美一级国产一级| 亚洲国产一级精品毛一级精品看免费视频| 人人操肉肉| 国产区性爱在线视频秋霞豆| 青青久久手机线视频| 玖玖爱免费观看视频| 亚洲日韩国产欧美综合v| 国模吧 一区二区三区| 超碰人妻在线| 日韩国语字幕| 超碰色中文| 天天干天天中出av| 欧美极品少妇| 色妺妺AⅤ| A级在线视频| 岛国片在线播放| 国产99久久99热这里只有精品15 | 日韩性爱播放| 欧美拳交在线播放| 综合 青草 伊久久 影院 综合| 狠狠热这里都是精品| 秋霞鲁丝午夜无码一区二区三| 玖玖爱伊人玖玖爱| 欧美乱欲| 收看日本人日bb| 欧美性爱视频免费一区一A| 久热99| 天天弄欧美| 97超碰精品成| 日夜精品| 男人天堂黄片| 九九色婷婷| 亚洲精品天天影视综合网| 久久成人午夜狠狠| 葡萄牙性视频一二区 | 欧美色图91| 999精品国产高清一区二区| 国产1769在线| 在线啊啊啊啊| 超碰在线第一页| 色综91| 国产自产自拍| 67914亚洲精品| 欧美日韩亚洲五月天婷婷| 国产精品另类| AA级电影三区| AV综合中文字幕干| 日本A级视频| 欧美成97爱| 久久黄色视频一区二区三区 | 国产乱码久久| 污电影在线观看| 亚洲一区二区三区在线激情| 中文字幕精品区先锋资源| 冬京热男人的天堂| www.久久超碰| 一类无码操逼视频| 九九热九九热| 91精品婷婷国产综合久久| 久久丁香久草综合网| 婷婷综合激情| 97在线资源| 性无码专区2020| 亚洲另类在线观看| 人人操人人射人人干| 亚洲熟妇一,二,三期| 日韩黄色电影网站| 久久久久ab| 国产精品ww久久| 69精品人人人人| 亚州图片第一页| 亚洲免费成人在线高清无码视频 | 国产不卡片| 在线二区不卡| 福利在线黄片| 夜夜 中文视频rt| 综合久久久久久久久91| 国产精品一区二区三区在线密挑| 97资源站久久| 久草视频在线视频在线视频在线观看| 嫩草 人人网精品| 天天做天天爱| 午夜免费视频1000| 亚洲欧美综合网 | 亚洲精品官网在线观看| 艾草av| 国产捆绑一区| 屌逼麻豆| 亚欧洲日韩国产精品| 人人做人人妻人人夜视频| 欧美人人天天网| 看大黄色大片原件| 撸撸成人在线视频| 91久久免费视频互動交流| 久草综合京东| 熟女探花啪啪| 九一亚洲国产免费| 一级黄色性爱裸体视频| 国产九九久久久精品| 78久久| 超碰资源亚洲97| 精品人妻一区二区免费蜜桃视频| 综合五月天| 久热最新在线杭州| 色蜜AV| 上特色A在线| 国语人妻精彩刺激| 97在线观看| 亚洲人在线| 在线综合 亚洲 欧美中文字幕| AV老汉| 6080YYY午夜理论片在线观看| 精品97精品97| 操逼啊啊啊91| 欧美淫乱视频| 五月天婷婷综合网| 亚洲图片欧美| 国产一区二区三区不卡手机在线| 在线观看不卡一区二区三区| 亚洲情色在线| 国产一区二区欧美日本| 亚洲第一页色网| 韩国一区二区精品亚洲| 色呦呦国产精品免费看| 欧美人妻色| 国产乱码精品一区二区三区四川| 天天干夜夜操一区二区| 六月丁香婷| 五月丁香黄色网| 91精品婷婷国产综合久久竹菊| 99在线无码精品秘 入口黑人| 天天综合网亚洲综合网| 日本久久网| 成 人 A V免费视频在线观看| 男生女生啊啊啊啊| 女人双腿搬开让男人桶| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | a'v在线资源| 大香蕉男人的天堂| 国产精品熟女丝袜一区二区| 人妻精品一区二区| 亚洲AV高潮| 无码抄逼网| 亚洲色婷婷久久91| 97天天在线| 伊人综合色网| 人妻81p| 欧美狠狠狠| 麻豆AV一区二区| 精品国产乱码久久久久久口爆网站 | 精品久久青青草| 国产极品99热在线播放69| 国语精品av| 亚洲吊色| 丁香五月色情| 欧美日韩色综合网| 久久啊啊| 欧美韩日精品资源| 2020中文字幕| 国产美女高潮叫床视频| 综合久久少妇中文字幕| 亚洲清纯唯美| 一区二区三区日韩欧美 | 亚洲啪AⅤ永久无码| 久区视频| 亚洲男人综合网| 欧美精品另类人妖xxxx| 人妻精品一区二区在线| 欧美极品美女aaaaaa级黄片| 亚洲色天堂九9| 嫩草伊人久久精品| 精品久久視頻在线| 亚洲码专区| 乱伦色图网址是多少| 熟妇视频一区二区三区在线| 98福利在线视频| 超碰午夜在线| 久久人妻视频网| 青草青草久热| 日本欧美韩国国产在线| 亚洲日韩天堂| 天天色综合影视网| 亚州男人的天堂| 亚洲色性情三级| 性欧美另类高清| 九九色热| 黑人黄片在线免费观看| 亚洲一区操| 啪啪视频免费在线观看| 91日韩国产欧美亚洲另类精盘州至城都| 男人的天堂在线| 一区二区 电影 亚洲| 国产久久久9999| 亚州色交| 99精品在线观看| 国产女性无套 免费观看| 日韩av不卡在线看| 天天爽夜夜爽夜夜爽精| 国产免费一区2区3区| 校园春色五月天| 日韩大香蕉AV影片| 久久久999国产精品| 丰满欧美放荡少妇在线| 欧美在线中M| 狠狠躁天天躁日日躁97| 久久香蕉超碰97国产精品| 五月婷久久| 1024手机看片欧美日韩| 啊啊好多水| 中文字幕少妇色 | 欧美一级久久久久久久大片动画| 强奸抽插av| 国产综合色精品在线观看| 97超碰超碰| 成人五月天丁香激情综合| 欲香欲色| 超碰欧美| 久久久新亚洲AV| 又大又大又大又粗爽高潮观看| 亚洲色宗合| 放黄片放3级黄片没穿衣服| 久久久96| 精品免费视频国产一区| 无码一区免费在线不卡| 国产成人超碰在线| 91人妻最真实刺激绿帽| 国产大陆天天艹| 手机在线人成免费视频| 欧美性爱精品一区二区| 大香蕉丝袜一级片| 婷婷五月天av| av婷婷色网| 免费网色网站| 人人爽夜夜玩视频| 日韩精品三级| 亚洲欧洲激情卡通另类文学四射小说网站 | 呦呦一区| 91性高朝久久久久久久久| 一级日本牲交大片好爽在线看| 亚洲天堂中文字| 狠狠激情综合狠狠操中文字幕| 色婷婷综合网站| 99热97| 欧美精品91| 黄色一区三区| 98久久超碰| 欧美不卡在线一区二区| 自拍偷拍 高清无码| 亚洲日本韩国在线| 77777亚洲蜜臀精品久久综合蜜臀| 亚洲欧美日韩有码| 青青草中日韩在线| 国产99热| 国产精品亚洲高清在线| 亚欧性爱在线无码| 日韩熟女精品无码专区一区二区 | 亚洲国产一级中文综合久久天堂在线免费观看 | 99操视频| 少妇诱惑视频| 97久久国产亚洲精品超碰热| 四虎影视精品| 国产乱伦性爱区| 婷婷五月激情综合| 国产SV一线| 国产又粗又长的视频| 日B操| 高清国产av无码| 麻豆黄四叶草网站| 91欧美情色|