精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

久久婷婷国产91天堂综合精品| 91网免费观看| 免费看的黄色网| 精品国产美女a久久9999| 中文字幕日韩一区| 国产精品日韩一区二区三区 | 91精品秘密在线观看| 精品av久久707| 在线观看高清免费视频| 日本高清在线观看| 国产色爱av资源综合区| 成人羞羞视频免费| 五月天中文字幕| 影音先锋国产精品| 最近2019中文字幕大全第二页| 国产精品日日摸夜夜爽| 国产精品99| 欧美日韩国产精品一区| 爱爱爱视频网站| 免费观看成年在线视频网站| 国产精品中文有码| 国产精品极品尤物在线观看 | 岛国av午夜精品| 992tv成人免费观看| 国产福利在线观看| 97se亚洲国产综合自在线| 国产日韩av在线| 无码人妻一区二区三区线| 亚洲特级毛片| 久久夜精品va视频免费观看| 亚洲黄色小说视频| 亚洲精品国产动漫| 精品久久久久久无| 天天操天天干天天做| 少妇精品视频一区二区免费看| 亚洲www啪成人一区二区麻豆| 综合视频在线观看| 97超碰人人在线| 国产日本欧美一区二区| 久久久一本精品99久久精品| a天堂在线观看视频| 青青草伊人久久| 日韩av大片免费看| 亚洲精品午夜国产va久久成人| 欧美精品三级| 欧美日本中文字幕| 国产波霸爆乳一区二区| 1024精品久久久久久久久| 在线亚洲午夜片av大片| www.av欧美| 九九久久精品| 亚洲男人的天堂在线| 老司机午夜免费福利| 97品白浆高清久久久久久| 日韩午夜电影在线观看| 伊人成人免费视频| 国产精品久一| 日韩精品中文字幕在线一区| 精产国品一区二区三区| 亚洲国产视频二区| 精品国产三级a在线观看| av漫画在线观看| 狠狠一区二区三区| 亚洲精品电影在线| 欧美高清性xxxx| 米奇777超碰欧美日韩亚洲| 国产午夜精品视频| 蜜桃视频最新网址| 久久久五月天| 久久久亚洲成人| 日韩欧美a级片| 先锋影音久久久| 国产精品国产福利国产秒拍 | 国产乱码在线| 午夜久久久影院| 久久久噜噜噜www成人网| 欧美黑人一区| 欧美高清激情brazzers| 精品人妻人人做人人爽夜夜爽| 激情视频极品美女日韩| 亚洲美女视频网站| 亚洲精品电影院| 亚洲综合色网| 4438全国成人免费| 一区二区三区在线免费观看视频| 精东粉嫩av免费一区二区三区| ts人妖另类在线| 五月婷婷激情在线| 中文久久乱码一区二区| 免费的av在线| 中文在线最新版地址| 欧美老人xxxx18| 无码国产精品一区二区免费式直播| 青青久久av| 中文字幕精品久久久久| 青青草原在线免费观看视频| 午夜亚洲一区| 91九色国产社区在线观看| 成人免费一级视频| 国产嫩草影院久久久久| 97在线免费视频观看| 最近在线中文字幕| 日韩欧美中文一区二区| 国产手机在线观看| 亚洲综合专区| 国产精品igao视频| 囯产精品一品二区三区| 欧美激情在线看| 精品国产一二三四区| 日韩黄色三级| 亚洲人成在线电影| 国产在线综合网| 捆绑紧缚一区二区三区视频| 国产日韩欧美综合精品| 黄色av电影在线播放| 精品欧美激情精品一区| 国产黑丝在线视频| 欧美精选视频在线观看| 韩国精品久久久999| 国产精品久久久久久69| 欧美极品aⅴ影院| 国产黄视频在线| 成人在线视频中文字幕| 精品国产一区二区三区久久狼5月| 国产免费av一区| 高潮精品一区videoshd| 中文字幕中文字幕一区三区| gay欧美网站| 精品久久久久久久久久久久包黑料 | 国产做受高潮漫动| 国产一区二区日韩精品| 午夜精品福利一区二区| 欧美xxx性| 日韩成人在线视频网站| 日韩伦人妻无码| 国产黄人亚洲片| 青青草原网站在线观看| 日韩精品第二页| 最新的欧美黄色| 欧美 亚洲 另类 激情 另类| 国产亚洲成av人在线观看导航| 鲁一鲁一鲁一鲁一澡| 久久a级毛片毛片免费观看| 欧美另类老女人| 97人妻精品一区二区三区| 国产精品色婷婷久久58| 天天操天天爱天天爽| 国产欧美一区二区三区精品观看 | 怡红院成人在线| 精品视频在线导航| 国产精品人人人人| 久久视频一区二区| 色诱视频在线观看| 国产精品欧美在线观看| 欧洲精品在线视频| 国产福利第一视频在线播放| 在线一区二区三区四区五区| 精品人伦一区二区| 蜜臀av性久久久久蜜臀av麻豆| 秋霞在线观看一区二区三区| 亚洲成人av观看| 中文字幕av日韩| 中文字幕 自拍偷拍| 国产精品区一区二区三区| 亚欧激情乱码久久久久久久久| 成人6969www免费视频| 国产主播在线一区| 污视频在线看网站| 精品国产91久久久久久久妲己| 日韩成人免费在线视频| 91色婷婷久久久久合中文| 亚洲人成色77777| 成人国产精品一级毛片视频| 成人两性免费视频| 黄网在线免费看| 亚洲精品美女久久| 中文字幕+乱码+中文乱码www| 国产精品理论片在线观看| 国产又粗又猛大又黄又爽| 亚洲精品乱码| 亚洲国产一区在线| 亚洲午夜精品| 日本精品久久久久久久| 欧美r级在线| 精品国内二区三区| 超碰在线97观看| 亚洲精品国产无套在线观| 800av在线播放| 日本欧美在线观看| 黄色一级大片免费| 视频精品在线观看| 91精品天堂| 88xx成人永久免费观看| 欧美人在线视频| 国产黄色免费在线观看| 欧美mv和日韩mv国产网站| www.日韩一区| 亚洲一区在线观看免费观看电影高清 | 精品少妇一二三区| 国产欧美一区二区三区网站| 一区二区在线免费观看视频| 久久九九电影| 欧美日韩dvd| 欧美日韩一二三四| 国产精品一码二码三码在线| 激情中国色综合| 欧美亚洲视频在线看网址| free性欧美hd另类精品| 亚洲欧美日韩久久久久久 | 亚洲成成品网站| 在线观看视频中文字幕| 欧美日韩国产精品一区二区三区四区 | 99久久久国产精品无码网爆| 一本一本大道香蕉久在线精品| 久久久久久久久毛片| 国产精品丝袜91| 国产ts丝袜人妖系列视频| 国产一区二区调教| 欧美日韩在线成人| 亚洲黑丝一区二区| 91视频成人免费| 色天天综合网| 日韩精品在在线一区二区中文| 成人知道污网站| 91人人爽人人爽人人精88v| 国产超碰精品| 欧美在线观看网站| eeuss鲁一区二区三区| 欧美不卡视频一区发布| 中文字幕在线免费| 中文字幕亚洲二区| 国产三级在线免费| 亚洲欧美日韩精品久久亚洲区| 婷婷色在线观看| 精品精品国产高清一毛片一天堂| 国产毛片毛片毛片毛片毛片| 欧美日高清视频| 中文无码精品一区二区三区| 在线一区二区观看| 日韩精品成人免费观看视频| 日韩欧美在线播放| 中文字幕精品无码一区二区| 欧美性色xo影院| 特级毛片www| 色吊一区二区三区| 国产成人a v| 91福利视频网站| 久久久久亚洲视频| 欧美视频在线观看一区| 久草热在线观看| 欧美乱妇23p| 999久久久久久| 日韩欧美一区二区免费| 亚洲第一天堂在线观看| 亚洲国产天堂久久国产91| 天天干视频在线| 亚洲欧美自拍一区| 91精品国产91久久久久游泳池 | 精品视频免费在线| 在线视频免费观看一区| 欧美二区在线观看| 国产视频在线观看免费 | 十九岁完整版在线观看好看云免费| 精品88久久久久88久久久 | 在线成人免费网站| 久cao在线| 欧美激情区在线播放| 国模私拍一区二区国模曼安| 国产高清视频一区三区| 色8久久久久| 99国产在线观看| 欧美偷窥清纯综合图区| 日本一区视频在线观看| 亚洲成人精品| 久久国产精品视频在线观看| 可以免费看不卡的av网站| 九九精品久久久| 国产成人av一区| 超碰97在线资源站| 中文字幕va一区二区三区| 国产男女猛烈无遮挡在线喷水| 一区二区成人在线| 精品不卡一区二区| 欧美精品一二三四| 日本黄色不卡视频| 在线成人中文字幕| 精精国产xxxx视频在线中文版| 欧洲成人在线视频| 精品中文字幕一区二区三区四区 | 九九热精品在线播放| 成人免费福利片| 中文字幕第二区| 亚洲小说欧美激情另类| 在线观看亚洲黄色| 欧美mv日韩mv| wwwxxx在线观看| 久久人人爽人人爽人人片av高请| 国精产品一区二区三区有限公司 | 干日本少妇首页| 久久激情五月激情| 黄色国产在线观看| 亚洲欧美成aⅴ人在线观看| 国产污视频网站| 欧美videofree性高清杂交| 精品美女视频在线观看免费软件| 伦理中文字幕亚洲| 欧美与亚洲与日本直播| 国产a一区二区| 999久久久91| 99热成人精品热久久66| 高清免费成人av| 日韩精品一区二区三区在线视频| 午夜av一区二区三区| 国产情侣一区二区| 中文字幕日韩免费视频| 国产91足控脚交在线观看| 国产欧美日韩丝袜精品一区| 亚洲欧美校园春色| 国产视频九色蝌蚪| 国产传媒久久文化传媒| 国产黄a三级三级| 在线一区二区三区四区五区| 婷婷婷国产在线视频| 久久免费视频在线| 涩爱av色老久久精品偷偷鲁| 亚洲欧洲精品一区二区三区波多野1战4 | 丁香婷婷综合色啪| 中文字幕在线观看成人 | 蜜臀久久精品久久久久| 欧美大奶子在线| 中文字幕日韩亚洲| 一区二区91美女张开腿让人桶| 日韩 欧美一区二区三区| 国内精品久久99人妻无码| 精品国产成人av| 天天爽夜夜爽夜夜爽| 午夜美女久久久久爽久久| 视频二区欧美| 人人妻人人澡人人爽欧美一区 | 欧美在线观看18| 黄色软件在线观看| 国产成+人+综合+亚洲欧洲 | 亚洲精品电影在线| 超碰资源在线| 好看的日韩精品| 亚洲少妇自拍| 欧洲女同同性吃奶| 日本国产一区二区| 777电影在线观看| 成人a级免费视频| 亚洲色图网站| 国产精品熟女一区二区不卡| 亚洲欧美一区二区三区极速播放| 国产一区二区在线播放视频| 久久久999国产| 在线精品视频一区| 日韩中文字幕在线免费| 91在线视频免费91| 久久精品视频2| 日韩亚洲一区二区| 奇米一区二区| 黄色一级在线视频| 久久一日本道色综合| 国产天堂第一区| xxx成人少妇69| 日韩欧美另类中文字幕| www精品久久| 国产亚洲精品中文字幕| 97国产成人无码精品久久久| 九九久久久久99精品| 美女扒开腿让男人桶爽久久动漫| 日韩免费毛片视频| 国产精品伦一区| 亚洲精品国偷拍自产在线观看蜜桃| 久久久久久久久久久网站| 亚洲动漫精品| 欧美视频亚洲图片| 午夜欧美在线一二页| 国产午夜视频在线观看| 亚洲资源在线看| 99在线热播精品免费99热| 欧美日韩国产黄色| 欧美一区二区私人影院日本| 韩国成人免费视频| 日本不卡二区高清三区| 国产乱色国产精品免费视频| 日韩高清精品免费观看| 色诱女教师一区二区三区| 久久久久亚洲精品中文字幕| 99热自拍偷拍| 亚洲欧洲精品一区二区三区| 人人妻人人澡人人爽久久av| 国产精品入口福利| 亚洲激情自拍| 精品亚洲乱码一区二区| 亚洲国产精品久久91精品| 亚洲福利影视| 国产精品97在线| 夜夜亚洲天天久久| 高h视频在线|