精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Linux信號(signal) 機制分析(2)

系統 Linux
本文分析了Linux內核對于信號的實現機制和應用層的相關處理。首先介紹了軟中斷信號的本質及信號的兩種不同分類方法尤其是不可靠信號的原理。接著分析了內核對于信號的處理流程包括信號的觸發/注冊/執行及注銷等。最后介紹了應用層的相關處理,主要包括信號處理函數的安裝、信號的發送、屏蔽阻塞等,最后給了幾個簡單的應用實例。

[[181771]]

接上文

5. 信號的發送

發送信號的主要函數有:kill()、raise()、 sigqueue()、alarm()、setitimer()以及abort()。

5.1 kill()

  1. #include <sys/types.h> 
  2. #include <signal.h> 
  3. int kill(pid_t pid,int signo)  

該系統調用可以用來向任何進程或進程組發送任何信號。參數pid的值為信號的接收進程

pid>0 進程ID為pid的進程

pid=0 同一個進程組的進程

pid<0 pid!=-1 進程組ID為 -pid的所有進程

pid=-1 除發送進程自身外,所有進程ID大于1的進程

Sinno是信號值,當為0時(即空信號),實際不發送任何信號,但照常進行錯誤檢查,因此,可用于檢查目標進程是否存在,以及當前進程是否具有向目標發送信號的權限(root權限的進程可以向任何進程發送信號,非root權限的進程只能向屬于同一個session或者同一個用戶的進程發送信號)。

Kill()最常用于pid>0時的信號發送。該調用執行成功時,返回值為0;錯誤時,返回-1,并設置相應的錯誤代碼errno。下面是一些可能返回的錯誤代碼:

EINVAL:指定的信號sig無效。

ESRCH:參數pid指定的進程或進程組不存在。注意,在進程表項中存在的進程,可能是一個還沒有被wait收回,但已經終止執行的僵死進程。

EPERM: 進程沒有權力將這個信號發送到指定接收信號的進程。因為,一個進程被允許將信號發送到進程pid時,必須擁有root權力,或者是發出調用的進程的UID 或EUID與指定接收的進程的UID或保存用戶ID(savedset-user-ID)相同。如果參數pid小于-1,即該信號發送給一個組,則該錯誤表示組中有成員進程不能接收該信號。

5.2 sigqueue()

  1. #include <sys/types.h> 
  2. #include <signal.h> 
  3. int sigqueue(pid_t pid, int sig, const union sigval val)  

調用成功返回 0;否則,返回 -1。

sigqueue()是比較新的發送信號系統調用,主要是針對實時信號提出的(當然也支持前32種),支持信號帶有參數,與函數sigaction()配合使用。

sigqueue的第一個參數是指定接收信號的進程ID,第二個參數確定即將發送的信號,第三個參數是一個聯合數據結構union sigval,指定了信號傳遞的參數,即通常所說的4字節值。

  1. typedef union sigval { 
  2.  
  3.                int  sival_int; 
  4.  
  5.                void *sival_ptr; 
  6.  
  7. }sigval_t;  

sigqueue()比kill()傳遞了更多的附加信息,但sigqueue()只能向一個進程發送信號,而不能發送信號給一個進程組。如果signo=0,將會執行錯誤檢查,但實際上不發送任何信號,0值信號可用于檢查pid的有效性以及當前進程是否有權限向目標進程發送信號。

在調用sigqueue時,sigval_t指定的信息會拷貝到對應sig 注冊的3參數信號處理函數的siginfo_t結構中,這樣信號處理函數就可以處理這些信息了。由于sigqueue系統調用支持發送帶參數信號,所以比kill()系統調用的功能要靈活和強大得多。

5.3 alarm()

  1. #include <unistd.h> 
  2.  
  3. unsigned int alarm(unsigned int seconds)  

系統調用alarm安排內核為調用進程在指定的seconds秒后發出一個SIGALRM的信號。如果指定的參數seconds為0,則不再發送 SIGALRM信號。后一次設定將取消前一次的設定。該調用返回值為上次定時調用到發送之間剩余的時間,或者因為沒有前一次定時調用而返回0。

注意,在使用時,alarm只設定為發送一次信號,如果要多次發送,就要多次使用alarm調用。

5.4 setitimer()

現在的系統中很多程序不再使用alarm調用,而是使用setitimer調用來設置定時器,用getitimer來得到定時器的狀態,這兩個調用的聲明格式如下:

  1. int getitimer(int which, struct itimerval *value); 
  2. int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);  

在使用這兩個調用的進程中加入以下頭文件:

  1. #include <sys/time.h> 

該系統調用給進程提供了三個定時器,它們各自有其獨有的計時域,當其中任何一個到達,就發送一個相應的信號給進程,并使得計時器重新開始。三個計時器由參數which指定,如下所示:

TIMER_REAL:按實際時間計時,計時到達將給進程發送SIGALRM信號。

ITIMER_VIRTUAL:僅當進程執行時才進行計時。計時到達將發送SIGVTALRM信號給進程。

ITIMER_PROF:當進程執行時和系統為該進程執行動作時都計時。與ITIMER_VIR-TUAL是一對,該定時器經常用來統計進程在用戶態和內核態花費的時間。計時到達將發送SIGPROF信號給進程。

定時器中的參數value用來指明定時器的時間,其結構如下:

  1. struct itimerval { 
  2. struct timeval it_interval; /* 下一次的取值 */ 
  3. struct timeval it_value; /* 本次的設定值 */ 
  4. };  

該結構中timeval結構定義如下:

  1. struct timeval { 
  2. long tv_sec; /* 秒 */ 
  3. long tv_usec; /* 微秒,1秒 = 1000000 微秒*/ 
  4. };  

在setitimer 調用中,參數ovalue如果不為空,則其中保留的是上次調用設定的值。定時器將it_value遞減到0時,產生一個信號,并將it_value的值設定為it_interval的值,然后重新開始計時,如此往復。當it_value設定為0時,計時器停止,或者當它計時到期,而it_interval 為0時停止。調用成功時,返回0;錯誤時,返回-1,并設置相應的錯誤代碼errno:

EFAULT:參數value或ovalue是無效的指針。

EINVAL:參數which不是ITIMER_REAL、ITIMER_VIRT或ITIMER_PROF中的一個。

下面是關于setitimer調用的一個簡單示范,在該例子中,每隔一秒發出一個SIGALRM,每隔0.5秒發出一個SIGVTALRM信號:

  1. #include <signal.h> 
  2.  
  3. #include <unistd.h> 
  4.  
  5. #include <stdio.h> 
  6.  
  7. #include <sys/time.h> 
  8.  
  9. int sec; 
  10.  
  11.   
  12.  
  13. void sigroutine(int signo) { 
  14.  
  15.         switch (signo) { 
  16.  
  17.         case SIGALRM: 
  18.  
  19.         printf("Catch a signal -- SIGALRM "); 
  20.  
  21.         break; 
  22.  
  23.         case SIGVTALRM: 
  24.  
  25.         printf("Catch a signal -- SIGVTALRM "); 
  26.  
  27.         break; 
  28.  
  29.         } 
  30.  
  31.         return
  32.  
  33.  
  34.   
  35.  
  36. int main() 
  37.  
  38.  
  39.         struct itimerval value,ovalue,value2; 
  40.  
  41.         sec = 5; 
  42.  
  43.   
  44.  
  45.         printf("process id is %d ",getpid()); 
  46.  
  47.         signal(SIGALRM, sigroutine); 
  48.  
  49.         signal(SIGVTALRM, sigroutine); 
  50.  
  51.   
  52.  
  53.         value.it_value.tv_sec = 1; 
  54.  
  55.         value.it_value.tv_usec = 0; 
  56.  
  57.         value.it_interval.tv_sec = 1; 
  58.  
  59.         value.it_interval.tv_usec = 0; 
  60.  
  61.         setitimer(ITIMER_REAL, &value, &ovalue); 
  62.  
  63.   
  64.  
  65.         value2.it_value.tv_sec = 0; 
  66.  
  67.         value2.it_value.tv_usec = 500000; 
  68.  
  69.         value2.it_interval.tv_sec = 0; 
  70.  
  71.         value2.it_interval.tv_usec = 500000; 
  72.  
  73.         setitimer(ITIMER_VIRTUAL, &value2, &ovalue); 
  74.  
  75.   
  76.  
  77.         for (;;) ; 
  78.  
  79.  

該例子的屏幕拷貝如下:

  1. localhost:~$ ./timer_test 
  2.  
  3. process id is 579 
  4.  
  5. Catch a signal – SIGVTALRM 
  6.  
  7. Catch a signal – SIGALRM 
  8.  
  9. Catch a signal – SIGVTALRM 
  10.  
  11. Catch a signal – SIGVTALRM 
  12.  
  13. Catch a signal – SIGALRM 
  14.  
  15. Catch a signal –GVTALRM  

5.5 abort()

  1. #include <stdlib.h> 
  2.  
  3. void abort(void);  

向進程發送SIGABORT信號,默認情況下進程會異常退出,當然可定義自己的信號處理函數。即使SIGABORT被進程設置為阻塞信號,調用abort()后,SIGABORT仍然能被進程接收。該函數無返回值。

5.6 raise()

  1. #include <signal.h> 
  2. int raise(int signo)  

向進程本身發送信號,參數為即將發送的信號值。調用成功返回 0;否則,返回 -1。

6. 信號集及信號集操作函數:

信號集被定義為一種數據類型:

  1. typedef struct { 
  2. unsigned long sig[_NSIG_WORDS]; 
  3. } sigset_t  

信號集用來描述信號的集合,每個信號占用一位。Linux所支持的所有信號可以全部或部分的出現在信號集中,主要與信號阻塞相關函數配合使用。下面是為信號集操作定義的相關函數:

  1. #include <signal.h> 
  2. int sigemptyset(sigset_t *set); 
  3. int sigfillset(sigset_t *set); 
  4. int sigaddset(sigset_t *setint signum); 
  5. int sigdelset(sigset_t *setint signum); 
  6. int sigismember(const sigset_t *setint signum); 
  7. sigemptyset(sigset_t *set)初始化由set指定的信號集,信號集里面的所有信號被清空; 
  8. sigfillset(sigset_t *set)調用該函數后,set指向的信號集中將包含linux支持的64種信號; 
  9. sigaddset(sigset_t *setint signum)在set指向的信號集中加入signum信號; 
  10. sigdelset(sigset_t *setint signum)在set指向的信號集中刪除signum信號; 
  11. sigismember(const sigset_t *setint signum)判定信號signum是否在set指向的信號集中。  

7. 信號阻塞與信號未決:

每個進程都有一個用來描述哪些信號遞送到進程時將被阻塞的信號集,該信號集中的所有信號在遞送到進程后都將被阻塞。下面是與信號阻塞相關的幾個函數:

  1. #include <signal.h> 
  2. int  sigprocmask(int  how,  const  sigset_t *set, sigset_t *oldset)); 
  3. int sigpending(sigset_t *set)); 
  4. int sigsuspend(const sigset_t *mask));  

sigprocmask()函數能夠根據參數how來實現對信號集的操作,操作主要有三種:

SIG_BLOCK 在進程當前阻塞信號集中添加set指向信號集中的信號

SIG_UNBLOCK 如果進程阻塞信號集中包含set指向信號集中的信號,則解除對該信號的阻塞

SIG_SETMASK 更新進程阻塞信號集為set指向的信號集

sigpending(sigset_t *set))獲得當前已遞送到進程,卻被阻塞的所有信號,在set指向的信號集中返回結果。

sigsuspend(const sigset_t *mask))用于在接收到某個信號之前, 臨時用mask替換進程的信號掩碼, 并暫停進程執行,直到收到信號為止。sigsuspend 返回后將恢復調用之前的信號掩碼。信號處理函數完成后,進程將繼續執行。該系統調用始終返回-1,并將errno設置為EINTR。

8. 信號應用實例

linux下的信號應用并沒有想象的那么恐怖,程序員所要做的最多只有三件事情:

  1. 安裝信號(推薦使用sigaction());
  2. 實現三參數信號處理函數,handler(int signal,struct siginfo *info, void *);
  3. 發送信號,推薦使用sigqueue()。

實際上,對有些信號來說,只要安裝信號就足夠了(信號處理方式采用缺省或忽略)。其他可能要做的無非是與信號集相關的幾種操作。

實例一:信號發送及處理

實現一個信號接收程序sigreceive(其中信號安裝由sigaction())。

  1. #include <signal.h> 
  2.  
  3. #include <sys/types.h> 
  4.  
  5. #include <unistd.h> 
  6.  
  7. void new_op(int,siginfo_t*,void*); 
  8.  
  9. int main(int argc,char**argv) 
  10.  
  11.  
  12.         struct sigaction act;   
  13.  
  14.         int sig; 
  15.  
  16.         sig=atoi(argv[1]); 
  17.  
  18.         
  19.  
  20.         sigemptyset(&act.sa_mask); 
  21.  
  22.         act.sa_flags=SA_SIGINFO; 
  23.  
  24.         act.sa_sigaction=new_op; 
  25.  
  26.         
  27.  
  28.         if(sigaction(sig,&act,NULL) < 0) 
  29.  
  30.         { 
  31.  
  32.                 printf("install sigal error\n"); 
  33.  
  34.         } 
  35.  
  36.         
  37.  
  38.         while(1) 
  39.  
  40.         { 
  41.  
  42.                 sleep(2); 
  43.  
  44.                 printf("wait for the signal\n"); 
  45.  
  46.         } 
  47.  
  48.  
  49.   
  50.  
  51. void new_op(int signum,siginfo_t *info,void *myact) 
  52.  
  53.  
  54.         printf("receive signal %d", signum); 
  55.  
  56.         sleep(5); 
  57.  
  58.  

說明,命令行參數為信號值,后臺運行sigreceive signo &,可獲得該進程的ID,假設為pid,然后再另一終端上運行kill -s signo pid驗證信號的發送接收及處理。同時,可驗證信號的排隊問題。

實例二:信號傳遞附加信息

主要包括兩個實例:

向進程本身發送信號,并傳遞指針參數

  1. #include <signal.h> 
  2.  
  3. #include <sys/types.h> 
  4.  
  5. #include <unistd.h> 
  6.  
  7. void new_op(int,siginfo_t*,void*); 
  8.  
  9. int main(int argc,char**argv) 
  10.  
  11.  
  12.         struct sigaction act;   
  13.  
  14.         union sigval mysigval; 
  15.  
  16.         int i; 
  17.  
  18.         int sig; 
  19.  
  20.         pid_t pid;          
  21.  
  22.         char data[10]; 
  23.  
  24.         memset(data,0,sizeof(data)); 
  25.  
  26.         for(i=0;i < 5;i++) 
  27.  
  28.                 data[i]='2'
  29.  
  30.         mysigval.sival_ptr=data; 
  31.  
  32.         
  33.  
  34.         sig=atoi(argv[1]); 
  35.  
  36.         pid=getpid(); 
  37.  
  38.         
  39.  
  40.         sigemptyset(&act.sa_mask); 
  41.  
  42.         act.sa_sigaction=new_op;//三參數信號處理函數 
  43.  
  44.         act.sa_flags=SA_SIGINFO;//信息傳遞開關,允許傳說參數信息給new_op 
  45.  
  46.         if(sigaction(sig,&act,NULL) < 0) 
  47.  
  48.         { 
  49.  
  50.                 printf("install sigal error\n"); 
  51.  
  52.         } 
  53.  
  54.         while(1) 
  55.  
  56.         { 
  57.  
  58.                 sleep(2); 
  59.  
  60.                 printf("wait for the signal\n"); 
  61.  
  62.                 sigqueue(pid,sig,mysigval);//向本進程發送信號,并傳遞附加信息 
  63.  
  64.         } 
  65.  
  66.  
  67. void new_op(int signum,siginfo_t *info,void *myact)//三參數信號處理函數的實現 
  68.  
  69.  
  70.         int i; 
  71.  
  72.         for(i=0;i<10;i++) 
  73.  
  74.         { 
  75.  
  76.                 printf("%c\n ",(*( (char*)((*info).si_ptr)+i))); 
  77.  
  78.         } 
  79.  
  80.         printf("handle signal %d over;",signum); 
  81.  
  82.  

這個例子中,信號實現了附加信息的傳遞,信號究竟如何對這些信息進行處理則取決于具體的應用。

不同進程間傳遞整型參數:

把1中的信號發送和接收放在兩個程序中,并且在發送過程中傳遞整型參數。

信號接收程序:

  1. #include <signal.h> 
  2.  
  3. #include <sys/types.h> 
  4.  
  5. #include <unistd.h> 
  6.  
  7. void new_op(int,siginfo_t*,void*); 
  8.  
  9. int main(int argc,char**argv) 
  10.  
  11.  
  12.         struct sigaction act; 
  13.  
  14.         int sig; 
  15.  
  16.         pid_t pid;          
  17.  
  18.         
  19.  
  20.         pid=getpid(); 
  21.  
  22.         sig=atoi(argv[1]);      
  23.  
  24.         
  25.  
  26.         sigemptyset(&act.sa_mask); 
  27.  
  28.         act.sa_sigaction=new_op; 
  29.  
  30.         act.sa_flags=SA_SIGINFO; 
  31.  
  32.         if(sigaction(sig,&act,NULL)<0) 
  33.  
  34.         { 
  35.  
  36.                 printf("install sigal error\n"); 
  37.  
  38.         } 
  39.  
  40.         while(1) 
  41.  
  42.         { 
  43.  
  44.                 sleep(2); 
  45.  
  46.                 printf("wait for the signal\n"); 
  47.  
  48.         } 
  49.  
  50.  
  51. void new_op(int signum,siginfo_t *info,void *myact) 
  52.  
  53.  
  54.         printf("the int value is %d \n",info->si_int); 
  55.  
  56.  
  57.    

信號發送程序:

命令行第二個參數為信號值,第三個參數為接收進程ID。

  1. #include <signal.h> 
  2.  
  3. #include <sys/time.h> 
  4.  
  5. #include <unistd.h> 
  6.  
  7. #include <sys/types.h> 
  8.  
  9. main(int argc,char**argv) 
  10.  
  11.  
  12.         pid_t pid; 
  13.  
  14.         int signum; 
  15.  
  16.         union sigval mysigval; 
  17.  
  18.         signum=atoi(argv[1]); 
  19.  
  20.         pid=(pid_t)atoi(argv[2]); 
  21.  
  22.         mysigval.sival_int=8;//不代表具體含義,只用于說明問題 
  23.  
  24.         if(sigqueue(pid,signum,mysigval)==-1) 
  25.  
  26.                 printf("send error\n"); 
  27.  
  28.         sleep(2); 
  29.  
  30.  

注:實例2的兩個例子側重點在于用信號來傳遞信息,目前關于在linux下通過信號傳遞信息的實例非常少,倒是Unix下有一些,但傳遞的基本上都是關于傳遞一個整數

實例三:信號阻塞及信號集操作

  1. #include "signal.h" 
  2.  
  3. #include "unistd.h" 
  4.  
  5. static void my_op(int); 
  6.  
  7. main() 
  8.  
  9.  
  10.         sigset_t new_mask,old_mask,pending_mask; 
  11.  
  12.         struct sigaction act; 
  13.  
  14.         sigemptyset(&act.sa_mask); 
  15.  
  16.         act.sa_flags=SA_SIGINFO; 
  17.  
  18.         act.sa_sigaction=(void*)my_op; 
  19.  
  20.         if(sigaction(SIGRTMIN+10,&act,NULL)) 
  21.  
  22.                 printf("install signal SIGRTMIN+10 error\n"); 
  23.  
  24.         sigemptyset(&new_mask); 
  25.  
  26.         sigaddset(&new_mask,SIGRTMIN+10); 
  27.  
  28.         if(sigprocmask(SIG_BLOCK, &new_mask,&old_mask)) 
  29.  
  30.                 printf("block signal SIGRTMIN+10 error\n"); 
  31.  
  32.         sleep(10); 
  33.  
  34.         printf("now begin to get pending mask and unblock SIGRTMIN+10\n"); 
  35.  
  36.         if(sigpending(&pending_mask)<0) 
  37.  
  38.                 printf("get pending mask error\n"); 
  39.  
  40.         if(sigismember(&pending_mask,SIGRTMIN+10)) 
  41.  
  42.                 printf("signal SIGRTMIN+10 is pending\n"); 
  43.  
  44.         if(sigprocmask(SIG_SETMASK,&old_mask,NULL)<0) 
  45.  
  46.                 printf("unblock signal error\n"); 
  47.  
  48.         printf("signal unblocked\n"); 
  49.  
  50.         sleep(10); 
  51.  
  52.  
  53.   
  54.  
  55. static void my_op(int signum) 
  56.  
  57.  
  58.         printf("receive signal %d \n",signum); 
  59.  
  60.  

編譯該程序,并以后臺方式運行。在另一終端向該進程發送信號(運行kill -s 42 pid,SIGRTMIN+10為42),查看結果可以看出幾個關鍵函數的運行機制,信號集相關操作比較簡單。

責任編輯:龐桂玉 來源: 嵌入式Linux中文站
相關推薦

2017-01-16 14:48:42

Linux信號機制分析

2024-07-16 10:52:09

2025-06-25 06:18:46

Linux多線程機制

2017-08-16 16:20:01

Linux內核態搶占用戶態搶占

2010-11-02 16:25:55

DB2鎖機制

2011-06-23 13:38:27

QT 元對象 信號

2011-07-05 18:40:19

QT 信號 機制

2011-07-05 18:32:52

QT 信號 機制

2011-06-09 09:45:35

Linux QT 信號

2017-05-03 08:52:13

卷積神經網絡神經網絡非線性激活函數

2017-05-05 08:57:06

卷積神經網絡機制

2024-07-25 11:53:53

2011-06-23 14:40:13

Qt 信號

2025-02-03 07:00:00

2021-12-10 00:01:53

Vsync信號機制

2021-11-11 17:40:08

WatchdogAndroid源碼分析

2010-06-22 10:05:36

Linux監控

2012-03-02 12:20:21

Javajmapjstack

2009-04-20 21:20:32

Linux文件系統存儲機制

2014-05-22 15:00:16

Android消息處理機制Looper
點贊
收藏

51CTO技術棧公眾號

亚洲av无码一区二区三区性色| 成人在线观看免费完整| 亚洲天堂一区二区| 欧美国产乱子伦 | 久久久久国产精品午夜一区| 这里只有精品久久| 国产成人精品综合久久久久99| 黄网站在线观| 国产日韩影视精品| 91影院未满十八岁禁止入内| www.伊人久久| 91精品一区二区三区综合在线爱| 亚洲精品ady| 亚洲精品20p| 女海盗2成人h版中文字幕| 国产精品视频你懂的| av色综合网| 波多野结衣在线观看一区| 欧美1区2区视频| 亚洲视频在线播放| 精品人妻一区二区免费| 成人精品动漫| 精品欧美激情精品一区| 超碰在线免费观看97| 少妇av一区二区| 国产自产视频一区二区三区| 性欧美暴力猛交69hd| 情侣偷拍对白清晰饥渴难耐| 色综合久久中文| 日韩一级完整毛片| 性欧美1819| 黑人巨大精品| 五月天国产精品| 最新不卡av| 高清av在线| 91老司机福利 在线| 91视频8mav| 久久这里只有精品9| 日韩视频二区| 国产做受高潮69| 免费看特级毛片| 日韩精品水蜜桃| 亚洲午夜色婷婷在线| 国产麻豆天美果冻无码视频 | 国产高清精品一区二区| 国产又黄又粗又长| 日韩avvvv在线播放| 欧美在线视频免费播放| 国产小视频在线看| 国产在线欧美| 欧美风情在线观看| 加勒比av在线播放| 欧美激情综合| 久久国产天堂福利天堂| 国产美女久久久久久| 成人羞羞动漫| 日韩中文字在线| 国产aaaaaaaaa| 日韩精品一区二区三区免费观看| 国产一区二区动漫| 亚洲一二三四五六区| 欧美一二区在线观看| 亚洲天堂色网站| 国产伦理片在线观看| 狠狠色丁香婷婷综合影院| 亚洲精品一区二区三区婷婷月| 菠萝菠萝蜜网站| 天美av一区二区三区久久| 精品亚洲国产成av人片传媒| 极品粉嫩小仙女高潮喷水久久 | 久久99久久99精品免费看小说| 色乱码一区二区三区网站| 色哟哟网站入口亚洲精品| 亚洲熟女少妇一区二区| 综合天堂久久久久久久| 欧美大秀在线观看| 日韩精品一卡二卡| 久久久久久久尹人综合网亚洲| 国产成人精品综合| 一级黄色片视频| 国产九色精品成人porny| 国产精品久久久久久久久久直播 | 国产精品高清乱码在线观看| 欧美曰成人黄网| 热久久久久久久久| 91精品久久久久久综合五月天| 337p日本欧洲亚洲大胆色噜噜| 一本色道综合久久欧美日韩精品| 精品一区电影| 成年人精品视频| 日本中文字幕免费| 日韩电影在线免费| 91麻豆蜜桃| 免费黄网站在线观看| 国产精品白丝在线| 国产九色porny| 欧美不卡高清一区二区三区| 欧美日本一区二区三区四区| 日韩高清一二三区| 九九视频精品全部免费播放| 久久久国产视频| 精品国产免费观看| 久久av中文字幕片| 狠狠综合久久av| 日本黄色片在线观看| 亚洲主播在线播放| 日日躁夜夜躁aaaabbbb| 成人av激情人伦小说| 国产一区二区三区在线视频 | 香蕉乱码成人久久天堂爱免费| 国产一区二区视频免费在线观看| 久久综合给合| 一区二区欧美激情| 久久久久久国产精品免费播放| 久久狠狠婷婷| 国产日韩久久| 黄色在线论坛| 在线视频综合导航| 美女又爽又黄免费| 91精品一区二区三区综合| 欧洲亚洲女同hd| 欧美 日韩 人妻 高清 中文| 国产嫩草影院久久久久| 天堂…中文在线最新版在线| 日韩午夜视频在线| 亚洲天堂av女优| 91国产丝袜播放在线| 国产资源在线一区| 色噜噜一区二区| 欧美a级在线观看| 精品国产伦理网| 欧美日韩午夜视频| 麻豆精品国产传媒mv男同| 国内视频一区二区| 91九色国产在线播放| 欧美一级片在线观看| 精品伦精品一区二区三区视频密桃| 国产欧美激情| 国产精品一区二区三区精品| 污影院在线观看| 欧美一区二区三区视频免费播放| 岛国片在线免费观看| 日韩国产精品91| 鲁鲁狠狠狠7777一区二区| av中文在线资源库| 亚洲成人激情图| 五月天综合在线| 国产成人av资源| 成年人深夜视频| 免费观看亚洲视频大全| 久久综合色88| 国产免费久久久| 亚洲美女精品一区| 91丝袜超薄交口足| 综合激情一区| 91免费版网站在线观看| av理论在线观看| 日韩欧美国产午夜精品| 69av视频在线| 国产suv精品一区二区883| 亚洲爆乳无码精品aaa片蜜桃| 精品国产一区二区三区2021| 欧美成年人视频| 亚洲AV无码精品国产| 亚洲一区二区中文在线| 白丝校花扒腿让我c| 精品av久久久久电影| 精品国产乱码一区二区三区四区 | 一区av在线播放| 日本人妻一区二区三区| 国产手机视频一区二区| 日本电影一区二区三区| 欧美在线一级| 欧美精品一本久久男人的天堂| 国产黄a三级三级三级| 亚洲一区二区欧美激情| 在线观看国产网站| 日韩影院精彩在线| 丰满女人性猛交| 97一区二区国产好的精华液| 97在线免费观看| 高清毛片在线看| 日韩午夜激情免费电影| 一级片中文字幕| 国产精品国产三级国产aⅴ中文| 在线免费黄色小视频| 国产在线不卡| 日日骚一区二区网站| 国产精品视频首页| 97久久精品国产| 电影在线一区| 日韩一区二区免费高清| 亚洲精品www久久久久久| 国产女主播在线一区二区| 亚洲免费在线播放视频| 99精品国产一区二区青青牛奶| 色姑娘综合av| 国产极品模特精品一二| 国产精品羞羞答答| 成人在线免费观看黄色| 伊人青青综合网站| 欧美视频在线观看一区二区三区| 色av成人天堂桃色av| 欧美成人免费看| 国产人伦精品一区二区| 日本精品一二三| 日韩av中文字幕一区二区| 日本香蕉视频在线观看| 精品国产日韩欧美| 国产精品综合久久久久久| av在线播放一区| 7777精品久久久久久| 男人在线资源站| 日韩电影中文字幕| 国产av无码专区亚洲av麻豆| 91精品福利在线| 日韩乱码人妻无码中文字幕| 国产精品乱码妇女bbbb| www.色天使| 成人免费毛片aaaaa**| 嫩草视频免费在线观看| 另类国产ts人妖高潮视频| 日本久久久网站| 91精品国产乱码久久久久久| 欧美亚洲另类在线一区二区三区| 成人激情自拍| 91入口在线观看| 精品久久在线| 国产第一区电影| 日韩脚交footjobhd| 欧美激情精品久久久| 黄色在线播放网站| 日韩在线www| 成年人在线视频免费观看| 日韩精品中文字幕在线播放| 黄色小视频免费观看| 91精品久久久久久久99蜜桃 | 精品一区在线播放| 黑人久久a级毛片免费观看| 91视频免费在线| 香蕉久久一区| 国产欧美亚洲精品| 国产资源一区| 国产精品中文久久久久久久| 你懂得影院夜精品a| 日韩av电影国产| 色尼玛亚洲综合影院| 欧美性视频在线| 欧美一级鲁丝片| 欧美有码在线观看| 性欧美18~19sex高清播放| 81精品国产乱码久久久久久| 不卡专区在线| 欧美亚洲第一页| 免费亚洲电影| 国产精品久久在线观看| 欧美日韩国产网站| 国产精品久久久久久搜索| 成人看片毛片免费播放器| 国产日韩欧美成人| 粉嫩av国产一区二区三区| 亚洲字幕一区二区| 国产成人精品福利| 九九九九九精品| 精品国产乱码久久久| 亚洲人成网站在线观看播放| 久久精品国内一区二区三区水蜜桃 | 成熟老妇女视频| 日韩av中文字幕一区二区三区| 高清一区在线观看| 国产中文一区二区三区| 亚洲av综合色区无码另类小说| av男人天堂一区| 摸摸摸bbb毛毛毛片| 亚洲三级在线免费观看| 久热精品在线观看| 一本一道久久a久久精品| 中文天堂在线资源| 91精品国产高清一区二区三区蜜臀| 精品国自产拍在线观看| 亚洲国产精品系列| 成人资源www网在线最新版| 精品国产一区二区三区四区在线观看 | 中文字幕日韩欧美| 日韩精品卡一| 热久久这里只有精品| 老司机精品视频网| www久久99| 欧美禁忌电影| 欧美在线观看黄| 欧美亚洲一级| 国产黑丝在线视频| 91麻豆精品在线观看| 性色国产成人久久久精品| 午夜视频一区在线观看| 欧美在线视频精品| 亚洲成人亚洲激情| 在线观看av黄网站永久| 久久男人资源视频| 国精品产品一区| 久久久久资源| 欧美在线免费一级片| 北条麻妃在线一区| 国产成人免费高清| 日韩av片在线| 黄色成人在线免费| 国产裸体无遮挡| 亚洲天堂影视av| 丁香花在线观看完整版电影| 国产精品视频久| 蜜桃tv一区二区三区| 黄色网在线视频| 蜜臀久久99精品久久久久久9| 久久性爱视频网站| 亚洲视频免费观看| 五月婷婷六月婷婷| 亚洲国产婷婷香蕉久久久久久| 免费大片黄在线| 日本91av在线播放| eeuss鲁片一区二区三区| 艳母动漫在线观看| 日韩精品一二区| 加勒比一区二区| 午夜a成v人精品| 亚洲成人黄色片| 免费91在线视频| 激情亚洲小说| 亚洲欧美日韩精品久久久| 老鸭窝91久久精品色噜噜导演| xxxxxx黄色| 亚洲制服丝袜在线| 国产福利视频导航| 久久视频在线看| 亚洲国产天堂| 在线观看亚洲视频啊啊啊啊| 日本不卡一区二区三区| 亚洲久久久久久久| 色综合天天在线| 日本福利片在线| 欧美一区二区三区免费观看| 精品资源在线| 成人一区二区免费视频| 国产999精品久久久久久| 免费在线黄色网| 欧美一区二区三区精品| 成人影院在线看| 91深夜福利视频| 欧美精品一级| 中国特级黄色大片| 姬川优奈aav一区二区| 日本免费网站在线观看| 午夜精品久久久久久99热| 日本成人7777| 日韩精品一区二区三区久久| 久久蜜桃一区二区| 夜夜躁日日躁狠狠久久av| 日韩在线观看免费全集电视剧网站| 日韩在线免费| 亚洲欧洲一区二区福利| 韩国成人福利片在线播放| 欧美做爰爽爽爽爽爽爽| 精品日产卡一卡二卡麻豆| av中文字幕在线看| 久久久久久久免费| 视频一区二区三区入口| 亚洲一级理论片| 欧美α欧美αv大片| 春色校园综合激情亚洲| 免费一区二区三区在在线视频| 日韩不卡一区二区三区 | 欧美精品一二| 天天摸天天舔天天操| 亚洲精品国产成人久久av盗摄| 囯产精品久久久久久| 欧美在线视频免费| 999视频精品| 91人人澡人人爽| 欧美日韩中文字幕在线视频| 成人动漫在线免费观看| 亚洲一区二区日本| 在线一区免费观看| a一级免费视频| 精品国产成人系列| 亚洲伦乱视频| 成人毛片100部免费看| 99久久er热在这里只有精品66| 成年人视频免费| 精品少妇v888av| 亚洲深夜福利在线观看| 五月天视频在线观看| 香蕉成人啪国产精品视频综合网| 户外极限露出调教在线视频| 91精品入口蜜桃| 日本91福利区| www.av视频在线观看| 中文字幕久久精品| 国产精东传媒成人av电影| 91制片厂毛片| 精品久久久久久久久久| 免费大片黄在线观看视频网站|