最全面的linux信號(hào)量解析

嵌入式電子 2023-06-26 23:06

一.什么是信號(hào)量


信號(hào)量的使用主要是用來(lái)保護(hù)共享資源,使得資源在一個(gè)時(shí)刻只有一個(gè)進(jìn)程(線程)
所擁有。
信號(hào)量的值為正的時(shí)候,說(shuō)明它空閑。所
測(cè)試的線程可以鎖定而使用它。若為0,說(shuō)明
它被占用,測(cè)試的線程要進(jìn)入睡眠隊(duì)列中,等待被喚醒。


二.信號(hào)量的分類

在學(xué)習(xí)信號(hào)量之前,我們必須先知道——Linux提供兩種信號(hào)量:
(1) 內(nèi)核信號(hào)量,由內(nèi)核控制路徑使用
(2) 用戶態(tài)進(jìn)程使用的信號(hào)量,這種信號(hào)量又分為POSIX信號(hào)量和SYSTEMV信號(hào)量。POSIX信號(hào)量又分為有名信號(hào)量和無(wú)名信號(hào)量。
有名信號(hào)量,其值保存在文件中, 所以它可以用于線程也可以用于進(jìn)程間的同步。無(wú)名信號(hào)量,其值保存在內(nèi)存中。
倘若對(duì)信號(hào)量沒(méi)有以上的全面認(rèn)識(shí)的話,你就會(huì)很快發(fā)現(xiàn)自己在信號(hào)量的森林里迷失了方向。


三.內(nèi)核信號(hào)量


1.內(nèi)核信號(hào)量的構(gòu)成


內(nèi)核信號(hào)量類似于自旋鎖,因?yàn)楫?dāng)鎖關(guān)閉著時(shí),它不允許內(nèi)核控制路徑繼續(xù)進(jìn)行。然而,當(dāng)內(nèi)核控制路徑試圖獲取內(nèi)核信號(hào)量鎖保護(hù)的忙資源時(shí),相應(yīng)的進(jìn)程就被掛起。只有在資源被釋放時(shí),進(jìn)程才再次變?yōu)榭蛇\(yùn)行。
只有可以睡眠的函數(shù)才能獲取內(nèi)核信號(hào)量;中斷處理程序和可延遲函數(shù)都不能使用內(nèi)核信號(hào)量。
內(nèi)核信號(hào)量是struct semaphore類型的對(duì)象,它在中定義:
struct semaphore {
   atomic_t count;
   int sleepers;
   wait_queue_head_t wait;
  }
count:相當(dāng)于信號(hào)量的值,大于0,資源空閑;等于0,資源忙,但沒(méi)有進(jìn)程等待這
個(gè)保護(hù)的資源;小于0,資源不可用,并至少有一個(gè)進(jìn)程等待資源。
wait:存放等待隊(duì)列鏈表的地址,當(dāng)前等待資源的所有睡眠進(jìn)程都會(huì)放在這個(gè)鏈表中。
sleepers:存放一個(gè)標(biāo)志,表示是否有一些進(jìn)程在信號(hào)量上睡眠。


2.內(nèi)核信號(hào)量中的等待隊(duì)列(刪除,沒(méi)有聯(lián)系)


上面已經(jīng)提到了內(nèi)核信號(hào)量使用了等待隊(duì)列wait_queue來(lái)實(shí)現(xiàn)阻塞操作。
當(dāng)某任務(wù)由于沒(méi)有某種條件沒(méi)有得到滿足時(shí),它就被掛到等待隊(duì)列中睡眠。當(dāng)條件得到滿足時(shí),該任務(wù)就被移出等待隊(duì)列,此時(shí)并不意味著該任務(wù)就被馬上執(zhí)行,因?yàn)樗直灰七M(jìn)工作隊(duì)列中等待CPU資源,在適當(dāng)?shù)臅r(shí)機(jī)被調(diào)度。
內(nèi)核信號(hào)量是在內(nèi)部使用等待隊(duì)列的,也就是說(shuō)該等待隊(duì)列對(duì)用戶是隱藏的,無(wú)須用戶干涉。由用戶真正使用的等待隊(duì)列我們將在另外的篇章進(jìn)行詳解。


3.內(nèi)核信號(hào)量的相關(guān)函數(shù)


(1)初始化:
void sema_init (struct semaphore *sem, int val);
void init_MUTEX (struct semaphore *sem); //將sem的值置為1,表示資源空閑
void init_MUTEX_LOCKED (struct semaphore *sem); //將sem的值置為0,表示資源忙
(2)申請(qǐng)內(nèi)核信號(hào)量所保護(hù)的資源:
void down(struct semaphore * sem); // 可引起睡眠
int down_interruptible(struct semaphore * sem); // down_interruptible能被信號(hào)打斷
int down_trylock(struct semaphore * sem); // 非阻塞函數(shù),不會(huì)睡眠。無(wú)法鎖定資源則馬上返回
(3)釋放內(nèi)核信號(hào)量所保護(hù)的資源:
void up(struct semaphore * sem);


4.內(nèi)核信號(hào)量的使用例程


在驅(qū)動(dòng)程序中,當(dāng)多個(gè)線程同時(shí)訪問(wèn)相同的資源時(shí)(驅(qū)動(dòng)中的全局變量時(shí)一種典型的
共享資源),可能會(huì)引發(fā)“競(jìng)態(tài)“,因此我們必須對(duì)共享資源進(jìn)行并發(fā)控制。Linux內(nèi)核中
解決并發(fā)控制的最常用方法是自旋鎖與信號(hào)量(絕大多數(shù)時(shí)候作為互斥鎖使用)。

ssize_t globalvar_write(struct file *filp, const char *buf, size_t len, loff_t *off){ //獲得信號(hào)量 if (down_interruptible(&sem)) {  return - ERESTARTSYS; } //將用戶空間的數(shù)據(jù)復(fù)制到內(nèi)核空間的global_var if (copy_from_user(&global_var, buf, sizeof(int))) {  up(&sem);  return - EFAULT; } //釋放信號(hào)量 up(&sem); return sizeof(int);}


四.POSIX 信號(hào)量與SYSTEM V信號(hào)量的比較


1. 對(duì)POSIX來(lái)說(shuō),信號(hào)量是個(gè)非負(fù)整數(shù)。常用于線程間同步。而SYSTEM V信號(hào)量則是一個(gè)或多個(gè)信號(hào)量的集合,它對(duì)應(yīng)的是一個(gè)信號(hào)量結(jié)構(gòu)體,這個(gè)結(jié)構(gòu)體是為SYSTEM V IPC服務(wù)的,信號(hào)量只不過(guò)是它的一部分。常用于進(jìn)程間同步。
2.POSIX信號(hào)量的引用頭文件是“”,而SYSTEM V信號(hào)量的引用頭文件是
”。
3.從使用的角度,System V信號(hào)量是復(fù)雜的,而Posix信號(hào)量是簡(jiǎn)單。比如,POSIX信
號(hào)量的創(chuàng)建和初始化或PV操作就很非常方便。


五.POSIX信號(hào)量詳解

1.無(wú)名信號(hào)量


無(wú)名信號(hào)量的創(chuàng)建就像聲明一般的變量一樣簡(jiǎn)單,例如:sem_t sem_id。然后再初始化該無(wú)名信號(hào)量,之后就可以放心使用了。
無(wú)名信號(hào)量常用于多線程間的同步,同時(shí)也用于相關(guān)進(jìn)程間的同步。也就是說(shuō),無(wú)名信號(hào)量必須是多個(gè)進(jìn)程(線程)的共享變量,無(wú)名信號(hào)量要保護(hù)的變量也必須是多個(gè)進(jìn)程(線程)的共享變量,這兩個(gè)條件是缺一不可的。


常見(jiàn)的無(wú)名信號(hào)量相關(guān)函數(shù):sem_destroy
int sem_init(sem_t *sem, int pshared, unsigned int value);
1)pshared==0 用于同一多線程的同步;
2)若pshared>0 用于多個(gè)相關(guān)進(jìn)程間的同步(即由fork產(chǎn)生的)
int sem_getvalue(sem_t *sem, int *sval);
取回信號(hào)量sem的當(dāng)前值,把該值保存到sval中。
若有1個(gè)或更多的線程或進(jìn)程調(diào)用sem_wait阻塞在該信號(hào)量上,該函數(shù)返回兩種值:
1) 返回0
2) 返回阻塞在該信號(hào)量上的進(jìn)程或線程數(shù)目
linux采用返回的第一種策略。
sem_wait(或sem_trywait)相當(dāng)于P操作,即申請(qǐng)資源。
int sem_wait(sem_t *sem); // 這是一個(gè)阻塞的函數(shù)
測(cè)試所指定信號(hào)量的值,它的操作是原子的。
若sem>0,那么它減1并立即返回。
若sem==0,則睡眠直到sem>0,此時(shí)立即減1,然后返回。
int sem_trywait(sem_t *sem); // 非阻塞的函數(shù)
其他的行為和sem_wait一樣,除了:
若sem==0,不是睡眠,而是返回一個(gè)錯(cuò)誤EAGAIN。
sem_post相當(dāng)于V操作,釋放資源。
int sem_post(sem_t *sem);
把指定的信號(hào)量sem的值加1;
呼醒正在等待該信號(hào)量的任意線程。
注意:在這些函數(shù)中,只有sem_post是信號(hào)安全的函數(shù),它是可重入函數(shù)

(a)無(wú)名信號(hào)量在多線程間的同步


無(wú)名信號(hào)量的常見(jiàn)用法是將要保護(hù)的變量放在sem_wait和sem_post中間所形成的
臨界區(qū)內(nèi),這樣該變量就會(huì)被保護(hù)起來(lái),例如:

#include #include #include #include #include int number; // 被保護(hù)的全局變量sem_t sem_id;void* thread_one_fun(void *arg){sem_wait(&sem_id);printf("thread_one have the semaphore\n");number++;printf("number = %d\n",number);sem_post(&sem_id);}void* thread_two_fun(void *arg){sem_wait(&sem_id);printf("thread_two have the semaphore \n");number--;printf("number = %d\n",number);sem_post(&sem_id);}int main(int argc,char *argv[]){number = 1;pthread_t id1, id2;sem_init(&sem_id, 0, 1);pthread_create(&id1,NULL,thread_one_fun, NULL);pthread_create(&id2,NULL,thread_two_fun, NULL);pthread_join(id1,NULL);pthread_join(id2,NULL);printf("main,,,\n");return 0;}

上面的例程,到底哪個(gè)線程先申請(qǐng)到信號(hào)量資源,這是隨機(jī)的。如果想要某個(gè)特定的順序的話,可以用2個(gè)信號(hào)量來(lái)實(shí)現(xiàn)。例如下面的例程是線程1先執(zhí)行完,然后線程2才繼續(xù)執(zhí)行,直至結(jié)束。

int number; // 被保護(hù)的全局變量sem_t sem_id1, sem_id2;void* thread_one_fun(void *arg){sem_wait(&sem_id1);printf("thread_one have the semaphore\n");number++;printf("number = %d\n",number);sem_post(&sem_id2);}void* thread_two_fun(void *arg){sem_wait(&sem_id2);printf("thread_two have the semaphore \n");number--;printf("number = %d\n",number);sem_post(&sem_id1);}int main(int argc,char *argv[]){number = 1;pthread_t id1, id2;sem_init(&sem_id1, 0, 1); // 空閑的sem_init(&sem_id2, 0, 0); // 忙的pthread_create(&id1,NULL,thread_one_fun, NULL);pthread_create(&id2,NULL,thread_two_fun, NULL);pthread_join(id1,NULL);pthread_join(id2,NULL);printf("main,,,\n");return 0;}


(b)無(wú)名信號(hào)量在相關(guān)進(jìn)程間的同步


說(shuō)是相關(guān)進(jìn)程,是因?yàn)楸境绦蛑泄灿?個(gè)進(jìn)程,其中一個(gè)是另外一個(gè)的子進(jìn)程(由fork產(chǎn)生)的。
本來(lái)對(duì)于fork來(lái)說(shuō),子進(jìn)程只繼承了父進(jìn)程的代碼副本,mutex理應(yīng)在父子進(jìn)程中是相互獨(dú)立的兩個(gè)變量,但由于在初始化mutex的時(shí)候,由pshared = 1指定了mutex處于共享內(nèi)存區(qū)域,所以此時(shí)mutex變成了父子進(jìn)程共享的一個(gè)變量。此時(shí),mutex就可以用來(lái)同步相關(guān)進(jìn)程了。

#include #include #include #include #include #include #include #include #include int main(int argc, char **argv){int fd, i,count=0,nloop=10,zero=0,*ptr;sem_t mutex;//open a file and map it into memoryfd = open("log.txt",O_RDWR|O_CREAT,S_IRWXU);write(fd,&zero,sizeof(int));ptr = mmap( NULL,sizeof(int),PROT_READ |PROT_WRITE,MAP_SHARED,fd,0 );close(fd);/* create, initialize semaphore */if( sem_init(&mutex,1,1) < 0) //{perror("semaphore initilization");exit(0);}if (fork() == 0){ /* child process*/for (i = 0; i < nloop; i++){sem_wait(&mutex);printf("child: %d\n", (*ptr)++);sem_post(&mutex);}exit(0);}/* back to parent process */for (i = 0; i < nloop; i++){sem_wait(&mutex);printf("parent: %d\n", (*ptr)++);sem_post(&mutex);}exit(0);}


2.有名信號(hào)量


有名信號(hào)量的特點(diǎn)是把信號(hào)量的值保存在文件中。
這決定了它的用途非常廣:既可以用于線程,也可以用于相關(guān)進(jìn)程間,甚至是不相關(guān)
進(jìn)程。


(a)有名信號(hào)量能在進(jìn)程間共享的原因


由于有名信號(hào)量的值是保存在文件中的,所以對(duì)于相關(guān)進(jìn)程來(lái)說(shuō),子進(jìn)程是繼承了父
進(jìn)程的文件描述符,那么子進(jìn)程所繼承的文件描述符所指向的文件是和父進(jìn)程一樣的,當(dāng)
然文件里面保存的有名信號(hào)量值就共享了。


(b)有名信號(hào)量相關(guān)函數(shù)說(shuō)明


有名信號(hào)量在使用的時(shí)候,和無(wú)名信號(hào)量共享sem_wait和sem_post函數(shù)。
區(qū)別是有名信號(hào)量使用sem_open代替sem_init,另外在結(jié)束的時(shí)候要像關(guān)閉文件一樣去關(guān)閉這個(gè)有名信號(hào)量。
(1)打開(kāi)一個(gè)已存在的有名信號(hào)量,或創(chuàng)建并初始化一個(gè)有名信號(hào)量。一個(gè)單一的調(diào)用就完
成了信號(hào)量的創(chuàng)建、初始化和權(quán)限的設(shè)置。

sem_t *sem_open(const char *name, int oflag, mode_t mode , int value);
name是文件的路徑名;
Oflag 有O_CREAT或O_CREAT|EXCL兩個(gè)取值;
mode_t控制新的信號(hào)量的訪問(wèn)權(quán)限;
Value指定信號(hào)量的初始化值。
注意:
這里的name不能寫(xiě)成/tmp/aaa.sem這樣的格式,因?yàn)樵趌inux下,sem都是創(chuàng)建
在/dev/shm目錄下。你可以將name寫(xiě)成“/mysem”或“mysem”,創(chuàng)建出來(lái)的文件都
是“/dev/shm/sem.mysem”,千萬(wàn)不要寫(xiě)路徑。也千萬(wàn)不要寫(xiě)“/tmp/mysem”之類的。
當(dāng)oflag = O_CREAT時(shí),若name指定的信號(hào)量不存在時(shí),則會(huì)創(chuàng)建一個(gè),而且后
面的mode和value參數(shù)必須有效。若name指定的信號(hào)量已存在,則直接打開(kāi)該信號(hào)量,
同時(shí)忽略mode和value參數(shù)。
當(dāng)oflag = O_CREAT|O_EXCL時(shí),若name指定的信號(hào)量已存在,該函數(shù)會(huì)直接返
回error。
(2) 一旦你使用了一信號(hào)量,銷毀它們就變得很重要。
在做這個(gè)之前,要確定所有對(duì)這個(gè)有名信號(hào)量的引用都已經(jīng)通過(guò)sem_close()函數(shù)
關(guān)閉了,然后只需在退出或是退出處理函數(shù)中調(diào)用sem_unlink()去刪除系統(tǒng)中的信號(hào)量,
注意如果有任何的處理器或是線程引用這個(gè)信號(hào)量,sem_unlink()函數(shù)不會(huì)起到任何的作
用。
也就是說(shuō),必須是最后一個(gè)使用該信號(hào)量的進(jìn)程來(lái)執(zhí)行sem_unlick才有效。因?yàn)槊總€(gè)
信號(hào)燈有一個(gè)引用計(jì)數(shù)器記錄當(dāng)前的打開(kāi)次數(shù),sem_unlink必須等待這個(gè)數(shù)為0時(shí)才能把
name所指的信號(hào)燈從文件系統(tǒng)中刪除。也就是要等待最后一個(gè)sem_close發(fā)生。


(c)有名信號(hào)量在無(wú)相關(guān)進(jìn)程間的同步


前面已經(jīng)說(shuō)過(guò),有名信號(hào)量是位于共享內(nèi)存區(qū)的,那么它要保護(hù)的資源也必須是位于
共享內(nèi)存區(qū),只有這樣才能被無(wú)相關(guān)的進(jìn)程所共享。
在下面這個(gè)例子中,服務(wù)進(jìn)程和客戶進(jìn)程都使用shmget和shmat來(lái)獲取得一塊共享內(nèi)
存資源。然后利用有名信號(hào)量來(lái)對(duì)這塊共享內(nèi)存資源進(jìn)行互斥保護(hù)。
File1: server.c

#include #include #include #include #include #include #include #include #define SHMSZ 27char SEM_NAME[]= "vik";int main(){char ch;int shmid;key_t key;char *shm,*s;sem_t *mutex;//name the shared memory segmentkey = 1000;//create & initialize semaphoremutex = sem_open(SEM_NAME,O_CREAT,0644,1);if(mutex == SEM_FAILED){perror("unable to create semaphore");sem_unlink(SEM_NAME);exit(-1);}//create the shared memory segment with this keyshmid = shmget(key,SHMSZ,IPC_CREAT|0666);if(shmid<0){perror("failure in shmget");exit(-1);}//attach this segment to virtual memoryshm = shmat(shmid,NULL,0);//start writing into memorys = shm;for(ch='A';ch<='Z';ch++){sem_wait(mutex);*s++ = ch;sem_post(mutex);}//the below loop could be replaced by binary semaphorewhile(*shm != '*'){sleep(1);}sem_close(mutex);sem_unlink(SEM_NAME);shmctl(shmid, IPC_RMID, 0);exit(0);}File 2: client.c#include #include #include #include #include #include #include #include #define SHMSZ 27char SEM_NAME[]= "vik";int main(){char ch;int shmid;key_t key;char *shm,*s;sem_t *mutex;//name the shared memory segmentkey = 1000;//create & initialize existing semaphoremutex = sem_open(SEM_NAME,0,0644,0);if(mutex == SEM_FAILED){perror("reader:unable to execute semaphore");sem_close(mutex);exit(-1);}//create the shared memory segment with this keyshmid = shmget(key,SHMSZ,0666);if(shmid<0){perror("reader:failure in shmget");exit(-1);}//attach this segment to virtual memoryshm = shmat(shmid,NULL,0);//start readings = shm;for(s=shm;*s!=NULL;s++){sem_wait(mutex);putchar(*s);sem_post(mutex);}//once done signal exiting of reader:This can be replaced byanother semaphore*shm = '*';sem_close(mutex);shmctl(shmid, IPC_RMID, 0);exit(0);}


六.SYSTEM V信號(hào)量


這是信號(hào)量值的集合,而不是單個(gè)信號(hào)量。相關(guān)的信號(hào)量操作函數(shù)由引用。


1.信號(hào)量結(jié)構(gòu)體


內(nèi)核為每個(gè)信號(hào)量集維護(hù)一個(gè)信號(hào)量結(jié)構(gòu)體,可在找到該定義:struct semid_ds {struct ipc_perm sem_perm; /* 信號(hào)量集的操作許可權(quán)限 */struct sem *sem_base; /* 某個(gè)信號(hào)量sem結(jié)構(gòu)數(shù)組的指針,當(dāng)前信號(hào)量集中的每個(gè)信號(hào)量對(duì)應(yīng)其中一個(gè)數(shù)組元素 */ushort sem_nsems; /* sem_base 數(shù)組的個(gè)數(shù) */time_t sem_otime; /* 最后一次成功修改信號(hào)量數(shù)組的時(shí)間 */time_t sem_ctime; /* 成功創(chuàng)建時(shí)間 */};struct sem {ushort semval; /* 信號(hào)量的當(dāng)前值 */short sempid; /* 最后一次返回該信號(hào)量的進(jìn)程ID 號(hào) */ushort semncnt; /* 等待semval大于當(dāng)前值的進(jìn)程個(gè)數(shù) */ushort semzcnt; /* 等待semval變成0的進(jìn)程個(gè)數(shù) */};


2.常見(jiàn)的SYSTEM V信號(hào)量函數(shù)


(a)關(guān)鍵字和描述符


SYSTEM V信號(hào)量是SYSTEM V IPC(即SYSTEM V進(jìn)程間通信)的組成部分,其他的有SYSTEM V消息隊(duì)列,SYSTEM V共享內(nèi)存。而關(guān)鍵字和IPC描述符無(wú)疑是它們的共同點(diǎn),也使用它們,就不得不先對(duì)它們進(jìn)行熟悉。這里只對(duì)SYSTEM V信號(hào)量進(jìn)行討論。
IPC描述符相當(dāng)于引用ID號(hào),要想使用SYSTEM V信號(hào)量(或MSG、SHM),就必須用IPC描述符來(lái)調(diào)用信號(hào)量。而IPC描述符是內(nèi)核動(dòng)態(tài)提供的(通過(guò)semget來(lái)獲取),用
戶無(wú)法讓服務(wù)器和客戶事先認(rèn)可共同使用哪個(gè)描述符,所以有時(shí)候就需要到關(guān)鍵字KEY來(lái)定位描述符。
某個(gè)KEY只會(huì)固定對(duì)應(yīng)一個(gè)描述符(這項(xiàng)轉(zhuǎn)換工作由內(nèi)核完成),這樣假如服務(wù)器和客戶事先認(rèn)可共同使用某個(gè)KEY,那么大家就都能定位到同一個(gè)描述符,也就能定位到同
一個(gè)信號(hào)量,這樣就達(dá)到了SYSTEM V信號(hào)量在進(jìn)程間共享的目的。


(b)創(chuàng)建和打開(kāi)信號(hào)量


int semget(key_t key, int nsems, int oflag)
(1) nsems>0 : 創(chuàng)建一個(gè)信的信號(hào)量集,指定集合中信號(hào)量的數(shù)量,一旦創(chuàng)建就不能更改。
(2) nsems==0 : 訪問(wèn)一個(gè)已存在的集合
(3) 返回的是一個(gè)稱為信號(hào)量標(biāo)識(shí)符的整數(shù),semop和semctl函數(shù)將使用它。
(4) 創(chuàng)建成功后信號(hào)量結(jié)構(gòu)被設(shè)置:
.sem_perm 的uid和gid成員被設(shè)置成的調(diào)用進(jìn)程的有效用戶ID和有效組ID
.oflag 參數(shù)中的讀寫(xiě)權(quán)限位存入sem_perm.mode
.sem_otime 被置為0,sem_ctime被設(shè)置為當(dāng)前時(shí)間
.sem_nsems 被置為nsems參數(shù)的值
該集合中的每個(gè)信號(hào)量不初始化,這些結(jié)構(gòu)是在semctl,用參數(shù)SET_VAL,SETALL
初始化的。
semget函數(shù)執(zhí)行成功后,就產(chǎn)生了一個(gè)由內(nèi)核維持的類型為semid_ds結(jié)構(gòu)體的信號(hào)量
集,返回semid就是指向該信號(hào)量集的引索。


(c)關(guān)鍵字的獲取


有多種方法使客戶機(jī)和服務(wù)器在同一IPC結(jié)構(gòu)上會(huì)合:
(1) 服務(wù)器可以指定關(guān)鍵字IPC_PRIVATE創(chuàng)建一個(gè)新IPC結(jié)構(gòu),將返回的標(biāo)識(shí)符存放在某
處(例如一個(gè)文件)以便客戶機(jī)取用。關(guān)鍵字 IPC_PRIVATE保證服務(wù)器創(chuàng)建一個(gè)新IPC結(jié)
構(gòu)。這種技術(shù)的缺點(diǎn)是:服務(wù)器要將整型標(biāo)識(shí)符寫(xiě)到文件中,然后客戶機(jī)在此后又要讀文件取得此標(biāo)識(shí)符。
IPC_PRIVATE關(guān)鍵字也可用于父、子關(guān)系進(jìn)程。父進(jìn)程指定 IPC_PRIVATE創(chuàng)建一個(gè)新IPC結(jié)構(gòu),所返回的標(biāo)識(shí)符在fork后可由子進(jìn)程使用。子進(jìn)程可將此標(biāo)識(shí)符作為exec函數(shù)的一個(gè)參數(shù)傳給一個(gè)新程序。


(2) 在一個(gè)公用頭文件中定義一個(gè)客戶機(jī)和服務(wù)器都認(rèn)可的關(guān)鍵字。然后服務(wù)器指定此關(guān)鍵
字創(chuàng)建一個(gè)新的IPC結(jié)構(gòu)。這種方法的問(wèn)題是該關(guān)鍵字可能已與一個(gè) IPC結(jié)構(gòu)相結(jié)合,在
此情況下,get函數(shù)(msgget、semget或shmget)出錯(cuò)返回。服務(wù)器必須處理這一錯(cuò)誤,刪除已存在的IPC結(jié)構(gòu),然后試著再創(chuàng)建它。當(dāng)然,這個(gè)關(guān)鍵字不能被別的程序所占用。


(3) 客戶機(jī)和服務(wù)器認(rèn)同一個(gè)路徑名和課題I D(課題I D是0 ~ 2 5 5之間的字符值) ,然后調(diào)用函數(shù)ftok將這兩個(gè)值變換為一個(gè)關(guān)鍵字。這樣就避免了使用一個(gè)已被占用的關(guān)鍵字的
問(wèn)題。
使用ftok并非高枕無(wú)憂。有這樣一種例外:服務(wù)器使用ftok獲取得一個(gè)關(guān)鍵字后,該文件就被刪除了,然后重建。此時(shí)客戶端以此重建后的文件來(lái)ftok所獲取的關(guān)鍵字就和服務(wù)器的關(guān)鍵字不一樣了。所以一般商用的軟件都不怎么用ftok。
一般來(lái)說(shuō),客戶機(jī)和服務(wù)器至少共享一個(gè)頭文件,所以一個(gè)比較簡(jiǎn)單的方法是避免使用ftok,而只是在該頭文件中存放一個(gè)大家都知道的關(guān)鍵字。


(d)設(shè)置信號(hào)量的值(PV操作)


int semop(int semid, struct sembuf *opsptr, size_t nops);(1) semid: 是semget返回的semid(2)opsptr: 指向信號(hào)量操作結(jié)構(gòu)數(shù)組(3) nops : opsptr所指向的數(shù)組中的sembuf結(jié)構(gòu)體的個(gè)數(shù)struct sembuf {short sem_num; // 要操作的信號(hào)量在信號(hào)量集里的編號(hào),short sem_op; // 信號(hào)量操作short sem_flg; // 操作表示符};

(4) 若sem_op 是正數(shù),其值就加到semval上,即釋放信號(hào)量控制的資源
若sem_op 是0,那么調(diào)用者希望等到semval變?yōu)?,如果semval是0就返回;
若sem_op 是負(fù)數(shù),那么調(diào)用者希望等待semval變?yōu)榇笥诨虻扔趕em_op的絕對(duì)值
例如,當(dāng)前semval為2,而sem_op = -3,那么怎么辦?
注意:semval是指semid_ds中的信號(hào)量集中的某個(gè)信號(hào)量的值


(5) sem_flg
SEM_UNDO 由進(jìn)程自動(dòng)釋放信號(hào)量
IPC_NOWAIT 不阻塞
到這里,讀者肯定有個(gè)疑惑:semop希望改變的semval到底在哪里?我們?cè)趺礇](méi)看到有它的痕跡?其實(shí),前面已經(jīng)說(shuō)明了,當(dāng)使用semget時(shí),就產(chǎn)生了一個(gè)由內(nèi)核維護(hù)的信號(hào)量集(當(dāng)然每個(gè)信號(hào)量值即semval也是只由內(nèi)核才能看得到了),用戶能看到的就是返回的semid。內(nèi)核通過(guò)semop 函數(shù)的參數(shù),知道應(yīng)該去改變semid 所指向的信號(hào)量的哪個(gè)semval。


(e)對(duì)信號(hào)集實(shí)行控制操作(semval的賦值等)


int semctl(int semid, int semum, int cmd, ../* union semun arg */);semid是信號(hào)量集合;semnum是信號(hào)在集合中的序號(hào);semum是一個(gè)必須由用戶自定義的結(jié)構(gòu)體,在這里我們務(wù)必弄清楚該結(jié)構(gòu)體的組成:union semun{int val; // cmd == SETVALstruct semid_ds *buf // cmd == IPC_SET或者 cmd == IPC_STATushort *array; // cmd == SETALL,或 cmd = GETALL};

val只有cmd ==SETVAL時(shí)才有用,此時(shí)指定的semval = arg.val。
注意:當(dāng)cmd == GETVAL時(shí),semctl函數(shù)返回的值就是我們想要的semval。千萬(wàn)不要以為指定的semval被返回到arg.val中。
array指向一個(gè)數(shù)組,當(dāng)cmd==SETALL時(shí),就根據(jù)arg.array來(lái)將信號(hào)量集的所有值都賦值;當(dāng)cmd ==GETALL時(shí),就將信號(hào)量集的所有值返回到arg.array指定的數(shù)組中。buf 指針只在cmd==IPC_STAT 或IPC_SET 時(shí)有用,作用是semid 所指向的信號(hào)量集
(semid_ds機(jī)構(gòu)體)。一般情況下不常用,這里不做談?wù)摗?/span>

另外,cmd == IPC_RMID還是比較有用的。
(f)例碼

#include #include #include #include static int nsems;static int semflg;static int semid;int errno=0;union semun {int val;struct semid_ds *buf;unsigned short *array;}arg;int main(){struct sembuf sops[2]; //要用到兩個(gè)信號(hào)量,所以要定義兩個(gè)操作數(shù)組int rslt;unsigned short argarray[80];arg.array = argarray;semid = semget(IPC_PRIVATE, 2, 0666);if(semid < 0 ){printf("semget failed. errno: %d\n", errno);exit(0);}//獲取0th信號(hào)量的原始值rslt = semctl(semid, 0, GETVAL);printf("val = %d\n",rslt);//初始化0th信號(hào)量,然后再讀取,檢查初始化有沒(méi)有成功arg.val = 1; // 同一時(shí)間只允許一個(gè)占有者semctl(semid, 0, SETVAL, arg);rslt = semctl(semid, 0, GETVAL);printf("val = %d\n",rslt);sops[0].sem_num = 0;sops[0].sem_op = -1;sops[0].sem_flg = 0;sops[1].sem_num = 1;sops[1].sem_op = 1;sops[1].sem_flg = 0;rslt=semop(semid, sops, 1); //申請(qǐng)0th信號(hào)量,嘗試鎖定if (rslt < 0 ){printf("semop failed. errno: %d\n", errno);exit(0);}//可以在這里對(duì)資源進(jìn)行鎖定sops[0].sem_op = 1;semop(semid, sops, 1); //釋放0th信號(hào)量rslt = semctl(semid, 0, GETVAL);printf("val = %d\n",rslt);rslt=semctl(semid, 0, GETALL, arg);if (rslt < 0){printf("semctl failed. errno: %d\n", errno);exit(0);}printf("val1:%d val2: %d\n",(unsigned int)argarray[0],(unsigned int)argarray[1]);if(semctl(semid, 1, IPC_RMID) == -1){Perror(“semctl failure while clearing reason”);}return(0);}


七.信號(hào)量的牛刀小試——生產(chǎn)者與消費(fèi)者問(wèn)題

1.問(wèn)題描述:


有一個(gè)長(zhǎng)度為N的緩沖池為生產(chǎn)者和消費(fèi)者所共有,只要緩沖池未滿,生產(chǎn)者便可將
消息送入緩沖池;只要緩沖池未空,消費(fèi)者便可從緩沖池中取走一個(gè)消息。生產(chǎn)者往緩沖池
放信息的時(shí)候,消費(fèi)者不可操作緩沖池,反之亦然。


2.使用多線程和信號(hào)量解決該經(jīng)典問(wèn)題的互斥


#include #include #include #define BUFF_SIZE 10char buffer[BUFF_SIZE];char count; // 緩沖池里的信息數(shù)目sem_t sem_mutex; // 生產(chǎn)者和消費(fèi)者的互斥鎖sem_t p_sem_mutex; // 空的時(shí)候,對(duì)消費(fèi)者不可進(jìn)sem_t c_sem_mutex; // 滿的時(shí)候,對(duì)生產(chǎn)者不可進(jìn)void * Producer(){while(1){sem_wait(&p_sem_mutex); //當(dāng)緩沖池未滿時(shí)sem_wait(&sem_mutex); //等待緩沖池空閑count++;sem_post(&sem_mutex);if(count < BUFF_SIZE)//緩沖池未滿sem_post(&p_sem_mutex);if(count > 0) //緩沖池不為空sem_post(&c_sem_mutex);}}void * Consumer(){while(1){sem_wait(&c_sem_mutex);//緩沖池未空時(shí)sem_wait(&sem_mutex); //等待緩沖池空閑count--;sem_post(&sem_mutex);if(count > 0)sem_post(c_sem_nutex);}}int main(){pthread_t ptid,ctid;//initialize the semaphoressem_init(&empty_sem_mutex,0,1);sem_init(&full_sem_mutex,0,0);//creating producer and consumer threadsif(pthread_create(&ptid, NULL,Producer, NULL)){printf("\n ERROR creating thread 1");exit(1);}if(pthread_create(&ctid, NULL,Consumer, NULL)){printf("\n ERROR creating thread 2");exit(1);}if(pthread_join(ptid, NULL)) /* wait for the producer to finish */{printf("\n ERROR joining thread");exit(1);}if(pthread_join(ctid, NULL)) /* wait for consumer to finish */{printf("\n ERROR joining thread");exit(1);}sem_destroy(&empty_sem_mutex);sem_destroy(&full_sem_mutex);//exit the main threadpthread_exit(NULL);return 1;}

定期以通俗易懂的方式分享嵌入式知識(shí),關(guān)注公眾號(hào),加星標(biāo),每天進(jìn)步一點(diǎn)點(diǎn)。


聲明:

本號(hào)原創(chuàng)、轉(zhuǎn)載的文章、圖片等版權(quán)歸原作者所有,如有侵權(quán),請(qǐng)聯(lián)系刪除。

?

關(guān)注、點(diǎn)贊、在看、轉(zhuǎn)發(fā),支持優(yōu)質(zhì)內(nèi)容!?

評(píng)論
  • 100 字導(dǎo)語(yǔ)工業(yè)防爆鎧裝線纜硬度高、結(jié)構(gòu)特殊,普通圓形防爆連接器密封結(jié)構(gòu)難以適配,極易出現(xiàn)夾不緊、滲水、線纜滑脫問(wèn)題。本文針對(duì)鎧裝線纜特性,匹配 4 芯、5PIN、8 芯防爆法蘭插座安裝工藝,明確鎧裝固定、密封壓緊、應(yīng)力釋放全套施工標(biāo)準(zhǔn)。關(guān)鍵詞:圓形防爆連接器,鎧裝線纜,防爆法蘭插座,防爆防水連接器,IP67,8 芯,防爆電源接頭,防爆接插件1 產(chǎn)品概述鎧裝線纜自帶金屬保護(hù)層,硬度大、不可隨意彎折,常規(guī)塑料密封套無(wú)法有效抱緊。很多現(xiàn)場(chǎng)直接使用普通格蘭密封鎧裝線,導(dǎo)致尾部密封失效、鎧裝層懸空松動(dòng)
    kyfbest科迎法電氣 2026-08-12 12:48 269瀏覽
  • 我在唯創(chuàng)知音做門鎖語(yǔ)音方案這幾年,常被廠商問(wèn)到一個(gè)看似簡(jiǎn)單的問(wèn)題,門鎖里的語(yǔ)音到底要做什么。門鎖語(yǔ)音在門鎖里早就不是加個(gè)喇叭那么回事。它要管門鈴、提示音、貓眼對(duì)講、藍(lán)牙配網(wǎng)播報(bào)、離線喊一聲開(kāi)門,還有大屏上的菜單動(dòng)效。這些功能分散在前板、后板、貓眼和 APP 四個(gè)部位,芯片怎么選,各部位完全不一樣。最基礎(chǔ)的一塊是門鈴和固定提示音。很多走量機(jī)型到現(xiàn)在還是一顆小容量語(yǔ)音芯片扛著,像 WTN 系列里的 WTN6006、WTN6020,F(xiàn)lash 從 低時(shí)長(zhǎng)到高時(shí)長(zhǎng)都有不同的芯片,協(xié)議相同可以無(wú)縫切換。它
    唯創(chuàng)知音語(yǔ)音芯片 2026-08-12 17:34 195瀏覽
  • 一只光模塊在出廠前,要在-40℃的極寒、25℃的常溫、85℃的高溫之間反復(fù)“渡劫”。稍有不慎,輕則參數(shù)漂移,重則整批報(bào)廢——這就是三溫測(cè)試,高速光模塊量產(chǎn)前的最后一道生死線。引言:AI越熱,測(cè)試越難AI數(shù)據(jù)中心的爆發(fā)式增長(zhǎng),讓400G、800G甚至1.6T光模塊的需求如火箭般躥升。但鮮為人知的是:光模塊速率每翻一番,測(cè)試時(shí)間卻不降反升。一組殘酷的數(shù)據(jù)對(duì)比:速率單只模塊測(cè)試耗時(shí)測(cè)試設(shè)備帶寬要求400G約15-20分鐘50GHz800G約20-30分鐘50GHz1.6T約40-60分鐘≥65GHz設(shè)
    用戶1774416745629 2026-08-12 13:36 292瀏覽
  • 8月8日,國(guó)聯(lián)民生證券發(fā)布了一則公告,內(nèi)容表明公司董事會(huì)收到了非執(zhí)行董事楊振興提交的辭職報(bào)告,其因個(gè)人原因辭去公司非執(zhí)行董事這一職務(wù)。而且在辭職之后,楊振興將不再擔(dān)任國(guó)聯(lián)民生證券以及其控股子公司的任何職務(wù)。僅僅兩天之后,公司第六屆董事會(huì)第7次會(huì)議召開(kāi),這次會(huì)議一口氣通過(guò)了多項(xiàng)議案,包括審議通過(guò)《國(guó)聯(lián)民生證券股份有限公司“十五五”發(fā)展規(guī)劃(2026-2030)》、1億至2億元A股回購(gòu)方案以及為子公司民生證券提供不超過(guò)40億元的動(dòng)態(tài)凈資本擔(dān)保承諾等等。同時(shí),為優(yōu)化資源配置,公司還擬減少民生證券注冊(cè)資
    用戶1782919753097 2026-08-13 00:00 229瀏覽
  • 隨著AI算力需求的爆發(fā)式增長(zhǎng),400G、800G乃至1.6T高速光模塊正加速走向商用部署。在這場(chǎng)速率競(jìng)賽的背后,一個(gè)不容忽視的挑戰(zhàn)正浮出水面——硅光模塊對(duì)溫度的“敏感體質(zhì)” ,正在成為可靠性驗(yàn)證領(lǐng)域的新課題。一、為什么硅光模塊如此“怕熱怕冷”?傳統(tǒng)光模塊主要采用III-V族化合物半導(dǎo)體材料(如InP、GaAs),而硅光模塊則以硅基材料為核心,借助CMOS兼容工藝實(shí)現(xiàn)光電器件的單片集成。這種技術(shù)路線帶來(lái)了成本低、集成度高、功耗小的優(yōu)勢(shì),但也埋下了溫度敏感性的隱患。根源在于材料的熱膨脹系數(shù)
    用戶1774416745629 2026-08-13 09:40 232瀏覽
  • 100 字導(dǎo)語(yǔ)廠區(qū)停機(jī)檢修、設(shè)備長(zhǎng)期靜置存放,防爆航插易受潮、積塵、膠圈老化、觸點(diǎn)氧化。本文針對(duì)停機(jī)復(fù)工場(chǎng)景,制定 3 針 3 孔、5PIN、8 芯圓形防爆連接器全套檢測(cè)保養(yǎng)流程,明確絕緣、導(dǎo)通、密封、屏蔽復(fù)工核驗(yàn)標(biāo)準(zhǔn),避免復(fù)工跳閘、信號(hào)異常。關(guān)鍵詞:圓形防爆連接器,復(fù)工檢測(cè),防爆航空插頭,防爆法蘭插座,防爆接插件,IP67, 靜置保養(yǎng),5PIN,8 芯1 產(chǎn)品概述設(shè)備長(zhǎng)期停機(jī)靜置,防爆連接器腔體密閉不通風(fēng),極易積聚潮氣、凝結(jié)水汽;密封件長(zhǎng)期靜態(tài)受壓出現(xiàn)永久形變;鍍金觸點(diǎn)鈍化氧化。直接通電復(fù)工極
    kyfbest科迎法電氣 2026-08-12 13:32 290瀏覽
  • 導(dǎo)語(yǔ):進(jìn)入8月,全球LCD TV面板采購(gòu)需求受年底大促備貨、以價(jià)換量策略雙重拉動(dòng)呈現(xiàn)邊際回暖,但修復(fù)力度整體有限。由于頭部面板廠持續(xù)維持高稼動(dòng)生產(chǎn),行業(yè)供需格局仍處寬松區(qū)間,面板價(jià)格整體延續(xù)小幅回落態(tài)勢(shì),尺寸結(jié)構(gòu)性分化特征持續(xù)顯現(xiàn)。CINNO Research 簡(jiǎn)評(píng)今年8月,全球 LCD TV面板市場(chǎng)呈現(xiàn)需求弱修復(fù)、供給高位運(yùn)行的特征,整體價(jià)格延續(xù)下行且結(jié)構(gòu)性分化顯著。需求端受年底大促備貨、以價(jià)換量策略拉動(dòng)邊際回暖,但修復(fù)力度有限且建立在以價(jià)換量的基礎(chǔ)上;供給端高世代線稼動(dòng)率維持85%以上,供需
    CINNOResearch 2026-08-12 11:00 151瀏覽
  • 100 字導(dǎo)語(yǔ)現(xiàn)場(chǎng)防爆航插頻繁出現(xiàn)插拔卡頓、沙沙異響、對(duì)位卡死等問(wèn)題,大多不是產(chǎn)品質(zhì)量問(wèn)題,而是粉塵進(jìn)腔、觸點(diǎn)氧化、防呆鍵位磨損導(dǎo)致。本文結(jié)合 3 針 3 孔、4 芯、5PIN、8 芯圓形防爆連接器運(yùn)行特性,梳理異響卡頓故障根源,制定標(biāo)準(zhǔn)化清潔修復(fù)流程,保障防爆航空插頭對(duì)接順暢、密封到位。關(guān)鍵詞:圓形防爆連接器,防爆航空插頭,防爆端子接頭,防爆接插件,插拔卡頓,IP67,5PIN,8 芯,防爆傳感器航插接頭1 產(chǎn)品概述圓形防爆連接器公母頭依靠精密鍵位、冠簧插孔、密封面精準(zhǔn)配合實(shí)現(xiàn)對(duì)接。現(xiàn)場(chǎng)粉塵堆
    kyfbest科迎法電氣 2026-08-12 11:43 243瀏覽
  • 報(bào)警語(yǔ)音在工業(yè)設(shè)備里的難題做工業(yè)設(shè)備的工程師多半遇到過(guò)這種事。設(shè)備上要播的語(yǔ)音條數(shù)越來(lái)越多,正常開(kāi)機(jī)提示、運(yùn)行狀態(tài)播報(bào)、故障報(bào)警、維護(hù)提醒、安全警告,加起來(lái)幾十條甚至上百條。一開(kāi)始用小容量 OTP 芯片還能應(yīng)付,條數(shù)一多就不夠用了。換大容量芯片,成本又上去了。更大的麻煩在報(bào)警優(yōu)先級(jí)上。工業(yè)設(shè)備運(yùn)行時(shí),語(yǔ)音芯片可能正在播放一段正常運(yùn)行狀態(tài)提示,比如"設(shè)備運(yùn)行中,請(qǐng)勿靠近"。這時(shí)候突然檢測(cè)到故障,需要立刻插播一條緊急報(bào)警語(yǔ)音"溫度過(guò)高,請(qǐng)立即停機(jī)檢查"。傳統(tǒng)語(yǔ)音芯片做不到這件事。它要么得先發(fā)停止命令
    唯創(chuàng)知音語(yǔ)音芯片 2026-08-12 17:50 231瀏覽
  • 導(dǎo)語(yǔ):根據(jù)CINNO ? ePaper Insight數(shù)據(jù),2026年上半年,全球電子紙終端總銷量約2.9億臺(tái)(枚),同比增長(zhǎng)25%。其中,電子紙價(jià)簽終端銷量2.8億枚,同比增長(zhǎng)27%,繼續(xù)成為產(chǎn)業(yè)增長(zhǎng)的核心動(dòng)力;電子紙平板銷量610萬(wàn)臺(tái),同比下降超過(guò)16%,較2025年上半年730萬(wàn)臺(tái)有所回落。細(xì)分市場(chǎng)看,閱讀器銷量480萬(wàn)臺(tái),辦公本銷量130萬(wàn)臺(tái)。整體來(lái)看,電子紙應(yīng)用結(jié)構(gòu)進(jìn)一步向智慧零售集中,價(jià)簽高景氣與平板階段性調(diào)整形成明顯分化。全球終端銷量同比增長(zhǎng)25%,價(jià)簽貢獻(xiàn)主要增量CINNO ?
    CINNOResearch 2026-08-12 11:05 235瀏覽
我要評(píng)論
0
點(diǎn)擊右上角,分享到朋友圈 我知道啦
請(qǐng)使用瀏覽器分享功能 我知道啦
主站蜘蛛池模板: 绝对防卫利维坦| 大清风云| 刺客伍六七3玄武国篇| 断魂小丑3在线播放| 我的女主别太萌免费观看| 我唾弃你的坟墓 在线| 火烧云全集| 秘密搜查官の大桥未久| 簧片网址大全| 姜子牙电影在线观看| 牙医姐妹在线免费观看视频| 太阳之歌女主角| 赛马娘巅峰之路| 1995版意大利版泰山在线观看 | 去有风的地方电视剧在线观看| 美国电影《需要爸爸播种》| 德古拉 希尔达| 醉拳2免费| 高胜美歌曲缘| 三大队电视剧在线观看| 私人女性监狱免费观看地址 | 大地中文在线观看免费高清电视剧 | 花与蛇牙医免费观看完整版| 中国春节 bbc 记录片| 樱桃红电视剧免费观看| 《替夫还债3》高清完整版在线观看中 | 萝莉的时间| 女员工的付出中字| 闪亮爱大结局| 《最高的爱人诏》三上解说| 凹凸世界免费看| 三日危情| 星克莱尔《迷宫》在线观看 | 日本电影丈夫不在家,公公突然来拜访 | 宜昌保卫战| 赤子板《姐妹牙医》百度| 《黑洞》电视剧全集| 魔侠传好玩吗| 女泳永教练的欲望| 斗破苍穹年番第168集更新| 将夜1电视剧西瓜免费| 吉林省| 《爱你的基蒂 第三季》| 东京塔越南女子别动队在线观看完整视频 | 绝世双骄电视剧完整版在线观看| 堕入地狱2| 儿媳份的味道| 在悠长的时光里等你| 高清《大江大河》电视剧| 炸天小姐在线观看免费版高清| 默杀 电影| 销售的秘密3HD| 宝贝我跟你老公比谁的更大| 大锅饭养懒汉| 一战到底 檀越| 华丽的外出未删减| 白峰电影全集免费全集| 爱的勘探法电视剧| 汶川灵异事件绝密档案| 步步倾心电视剧免费观看完整版| 钟丽缇版晚娘| 公孚的手之中文5| 欲海情魔无删减完整版在线播放| 啊进去了| 单身男女韩剧免费观看 | 法航空姐11季最新更新内容| 幸得相遇离婚时短剧免费观看| 敢死队4| 庆城县| 爱在春天电视剧免费观看| 皇家奶娘碰碰| 亲密敌人高清下载| 扫黑风暴电视剧免费观看全集 | flowerover真人| 人生若只如初见解释| 聊斋叶子楣电影全集免费观看| 快播复仇者联盟| 酒场交际花| 木下檀檩子在线| 余生免费观看| 你和我的倾城时光剧情分集介绍| 木府风云40集| 她很漂亮韩剧高清在线观看| 我亲爱的侄儿们1974剧情简介| 成龙历险记第四季| 牙医姊妹在线电影| 男与女完整版电视剧免费高清| 《疯狂动物城1》免费完整版| 男人和女人一愁愁愁电视剧在线| 泰剧国语版全集| 阿b哥的一天全集| 绝代艳星宝莲的一生| 且试天下免费观看| 人猿泰山HR版未删减版下载| 搞笑一家人国语版全集 | 蒋玲玲版《渔夫的荒野食记》电影医| 七夕潘甜甜牛郎织女资源 | 中国人已着手在月球生产水了| 图片| 义子的无理侵犯在线观看| 买房子的女销售3中字| 漂白在线播放| 《21世纪》全集免费看| 小生惊惊| 夜班经理 第二季| 美国爸爸要播种2季免费观看| 电影情劫| 已婚妇女的下午电影高清完整版| 懵懂的女孩| 闪光夫妇全集高清| 小姨子2电影| 天地逃生国语| 瓜达卢佩的玫瑰免费观看| 女老板的滋味| 熊出没之环游世界| 侄女开发日记樱花动漫第2季最新更新 | 美国禁忌满天星| 绝密卧底电视剧免费观看| 《金牌销售的秘密1》免费全集| 《推油》完整版免费观看| 杨光的夏天全集| 特殊的按摩方式医院急诊室| 我是刑警免费高清播放在线观看| 侄女开发日记免费完整| 美国惊悚片无人生还2012| 逆转女王国语版全集| 兄妹高清完整版在线观看| 奔月演员表| 修理工的艳遇在线观看| 关于爱在线观看| 台剧浪漫女家教在线播放| 树影迷宫电视剧在线观看全集免费| 三姐妹高清在线观看免费韩剧| 电影爱的色放在线观看| 降头电影国语| 海兴县| 水手服饲育| 俄罗斯版《女儿国》2| 李阳疯狂英语全集| 男女生一起愁愁愁电影在线观看| 《邻家姐姐》免费观看电视剧中字| 复仇笔记2| 性感海滩3去码补丁| 老包青天83版免费全集| 战狼6欧式少女版资源百度云| 分手后程医生哭出鼻涕泡短剧免费 | 渴望城市电视剧全集| 插曲的痛第60集全集能看见的全部私密处 | 用身体偿还给客户社长的妻子在线观看| 我在北京挺好的剧情| 公之浮中字1-10| 无法抗拒的他第四集| 葬送的芙莉莲动漫免费观看| 三方国界在线观看完整免费版| 变形金刚3国语| 需要爸爸播种子美国电影1976完整版电| 免费完整版| 黑白大战在线播放免费观看| 神之晚餐全集在线观看| 伸冤人1免费观看高清版| 完美的他电视剧| 绝世战魂免费观看完整版动漫| 《需要爸爸播种美国》英文版演员全 | 丰满的女邻居在线观看| 漂亮得小姨| 幻想万华镜| 九一麻花高清看| 岁岁年年柿柿红| 年轻漂亮的保姆.6| 韩剧三生| 订阅男友| 台湾版1987版渔夫| 爱欲疑狂| 香醇的绣感完整版| 暴走潜龙2| 《偷天宝鉴》叶子楣免费观看 | 圣斗士星矢欧米茄| 2对1:三人一次性体检日剧| 千王之王 周星驰| 第六感泰剧| 电视剧战狼战狼在线观看免费| 所有奥特曼全集| 甜蜜小狐狸1983满天星帕克| 原罪电影| 荣誉法则凯登杰西斯托雅| 怡红院在线 视频免费| 《特殊游泳教练》完整版| 大男当婚 下载| 美乃雀电影免费在线观看| 魔境仙踪电影| 旋风少女| 怎么办家康在线观看| 原始武器电影完整版观看国语| 莫妮爱我几何免费高清电影| 牧神记第39集在线观看视频| 女销售的秘密2| 电视剧李卫辞官| 男按摩中字在线播放| 送给不值一提的过去是什么歌| 演员请就位第二季第五期在线观看| 哈马斯与法塔赫在北京磋商| 女忍大桥未久无删减版电影| 春草大结局| 聊斋画皮免费观看完整版 | 致命诱惑电影完整版| 《零度暧昧》免费全集| 那年我们一起追过的女孩| 人猿泰山意大利hr版| 美女被破处| 邻家有女韩剧免费| 喜多岛舞| 无敌僵尸王 电视剧| 哈尔移动城堡| 女人的抉择全集百度影音| 《灭火宝贝》| 无良公会无修改板| 侬李夭桃| 末代皇帝电影无删减版观看| 美国式保罗2 原版| 罪域30| 八戒八戒10在线观看全集免费| 新版寒冰出装| 想要爸爸播种子苹果视频在线观看 | 一只绣花鞋| 秘密爱情| 热血街区极恶王X2完整版| 乐在其中 途我自在| 黑帮生意| 神医喜来乐下载| 《安娜的秘密》满天星在线观看| 靳东甄子丹当选全国政协委员| 金牌销售的秘密3HD中字| 杨门寡妇肉床电影完整版| 控制女上司| 日出免费| 黑白配高清国语免费观看视频| 夏日情人在线观看| 法国私人航空电影在线观看| 韩国电影出轨| 锵锵锵锵锵锵锵免费观看完整版大全| 吞噬星空106集| 生活中的玛丽在线伦理| 囧妈初一上线免费播出| 韩国奇妙的发型屋免费观看原版 | 电影《扒皮割奶》电影免费看| 棕眼之谜免费观看全集| 黑执事第2季| 高清《蜜桃成熟时5》国语| 惊天铁案在线观看| 漂流浴室在线观看| 姐姐真好23集在线观看| 乡村老板:致富全村短剧全集| 电影《霸王别姬》| 人猿泰山h版在线播放| 邻家间谍| 人生特别档案| 出关电视剧全集在线| 电视剧长安十二时辰| 给你我的喜欢电视剧| 盖亚奥特曼全集| 高清杜塞未删减| 安徽民间小调憨子| 岁岁青莲电视剧免费观看| 高清《憨豆先生》在线观看| 孙静雅新浪微博| 披荆斩棘第四季在线观看免费版| 纯白之恋全集| 许冠杰光荣引退汇群星| 爱有多深| 大梦归离在线观看全集免费播放| 女机械人在线| 母子情仇电视剧| 欲火狂蜜| 韩国23岁女子杀害陌生女子| 魔法圣婴在线观看| 柒个我剧情介绍| 陈式太极拳老架一路74式| 数码宝贝第二部日语| 绝代双骄在线观看| 以家人之名免费观看全集电视剧| 且试天下电视剧在线观看完整版| 《青囊传》电视剧| 喜庆农家全集| 两个人看的电影在线观看 | 超级教师| 农场主儿女1986免费观看| 邳州砍刀帮| 孟羽童疑似成立个人工作室| 南洋十大邪术免费| 矿桥第8集体检超棒| 占有欲强母亲免费观看电视剧| VHOTEL第一季在线| 孤芳不自赏 电视剧| 妈妈的职业5完整版结局在线看免费高清 | 爱人 韩国电影快播| 老公上司来我家| 我的心里只有你没有他李宇春| 《特殊的旅行》韩剧| 电影爱情大全免费观看| 中文字Dl幕岳 和女电影| 《迪拜的女孩2满天星》| 反叛的鲁路修第二季在线观看| 苍空井电影| 野花免费观看高清视频| 老同学6普通话| 惊情电影| 平遥县| 龙年档案电视剧26集免费观看| 康马县| 杀出绝地| 疯狂爱情韩剧全集免费观看| 我最好朋友的婚礼 电影| 疯狂72小时| 金手指在线观看| 最近韩国电影免费观看高清版| 一二三电影| 家事如天电视剧| 使徒行者3粤语电视剧| 滚滚血脉| xl司令在线观看免费| 黑洞电视剧全集| 老婆6高清版电视剧在线观看免费| 冲上云霄1主题曲| 法国空乘9特别版| 六年级毕业考试分数| 刀客家族的女人 电视剧| 《美丽妻子替弟还债韩国| 斗罗大陆免费完整观看197| 美辰之屋6| 镜双城电视剧免费观看全集完整版 | 小776| 不负如来不负卿电视剧| 中俄列车大劫案纪录片| 感官之旅| 巴菲特认错| 河北梆子辕门斩子全集| 我的幸福婚约| 伍六七之记忆碎片免费观看| 巜人妻初次按摩2在线| 高清《安娜情欲史》未删减版 | 饥饿站台2在线观看| 酒店1-80集全集免费,高清 | 高清《巨型病毒》电影| 爱情公寓第三部| 年代秀20130315| 废柴兄弟| 高压监狱法版伦理| 无所畏惧电视剧| 站着再来一次26集更新时间| 一世真爱情免费观看全部电视剧| 天字号监狱电影免费观看全集| 千山暮雪百度影音| 伦理《法国空乘4观看 | 怪奇物语第三季免费观看完整版 | 《无法抗拒的温柔》大结局| 《销售秘密》3| 电影大转折| 最强驱魔师vs花子第一集免费观看视频 | 美女化妆前后对比| 坎贝奇第二部曲品味人生电影在线| 仙逆112完整版观看| 那年花开月正圆 迅雷下载| 大院里的女人| 南航空难黑匣子录音| 《裸体按摩师2》电影在线观看| 等你回家 宋佳| 牙医赤板栗完整版在线观看| 半熟恋人综艺第三期下在线观看| 战狼9欧式少女战狼十二| 狂飙高清在线观看| 传闻中的陈芊芊第一集| 如龙电影| 釜山行2资源| 《巨乳按摩》91传媒| 澳门风云| 安斋拉拉的电影| 小猪佩奇100集免费完整版| 朋友别哭刘芳| 耻辱 电影| 尸体派对2| 韩国免费性爱电影需要爸爸的种子| 《我不是戏神》第一季在线观看全集| 需要爸爸播种子电影在线观看| 号手就位剧情介绍| 人会被气死吗| 假面之夜| 牧神记第39集在线观看视频| 《满天星版·波斯女人》百度 | 女版战狼6全集免费看| 甜心派泰剧在线观看第二集| 在丈夫面前被别人欺负日语| 金鹰卡通疯狂的麦咭| 昔有琉璃瓦| 美国禁忌三部曲满天星免费| 华胥引之绝爱之城电视剧全集| 年轻女保险销售员2| 特种部队2 影音| 东北富婆25分钟对白| 男按摩师做乳房按摩电影中文 | 韩国售楼小姐电影免费观看高清版| 老九门西瓜| 天海翼在线播放| 胡小林十念法| 乱世佳人免费| 美式忌讳1~2| 穿越火线秒杀| 落魄的贵族琉璃川在线观看免费完整版| 借枪在线观看| 叔母的爱电影免费观看完整版| 苍井空经典电影| 比悲伤更悲伤的故事在线观看| 午夜寂寞影院安卓| 流星花园 泰版观看全集| 女儿国3满天星版哪里能看| 苍井空的《肉乳浴屋》| 快乐大本营2014| 嘻嘻哈哈四重奏| 庆余年2免费观看| 双女任务在线观看免费高清英语版 | 龙兄虎弟国语高清| 维修工人的艳遇韩国| 欢笑老弄堂| 安多县| 幸福最晴天 电视剧| 乌台诗案的受害者| 女教师洗澡被学生强伦| 幸福里的故事| 三年大片免费观看国语完| 监狱风云3逃犯| 侏罗纪公园 2013 电影| 电影韩国r| 婚姻保卫战1| 莫妮卡爱我几何在线观看全集免费播放 | 花花公子电子杂志| 游樣2T| 上位完整版在线观看| 《顶级人生》电影| 傻瓜妈妈插曲| 免费中文在线播放电视剧推荐| ady无码| 我在大学修文物未删减| 凯登克罗斯主演作品在线播放| 锄奸电视剧| 鹿铃免费| 97超频在线视频免费观看| 幸福触手可及百度百科| 《诱人的岳 》李银美| 《浴血黑帮:不朽传奇》| 一个好妈妈HD2中字人人| 菠萝菠萝蜜电影免费| 海扁王2百度影音| 朴亚珍《蓝色隐身帽》全集| 扫黑风暴26| 外来从业人员综合保险查询| 《模特人生》韩剧| 尖峰时刻3国语高清| 想要爸爸播种手机播放美国电影 | 法国版《女超人:麦乐迪》在线播放日| 极恶老大第一季| 燃野少年的天空 电影| 玉蒲团二之玉女心经| 王保长歪传高清| 越南战争女兵的电影| 弱杀在线| 回娘家简谱| 丰满少女免费电影| 九河龙蛇| 禁忌6年转一代| 侠客行全集| 四十分钟插曲视频在线观看 | 半夏电视剧免费观看全集剧情| 《美丽女儿替父亲还债》剧情| 湾仔之虎| 夺命手机| 啄木鸟《劳拉的遗产》叫什么| 天巡者电视剧在线观看免费| 《按摩》意大利电影原名叫什么金达 | 釜山行2半岛在线观看完整版| 我的幸福婚姻真人版电视剧| 传家电视剧免费观看| 《交通费》电影| 四个少妇的精油按摩| 需要爸爸播种籽2中文版免费观看| 总会再相见全集观看| 十八岁的天空第二部| 江山为重| 饲养1小时42分原版在哪看| 玛利亚别墅| 舞出我人生2迅雷下载| 男按摩师三级在线看| 星汉灿烂月升沧海在线观看| 梦想的声音免费观看| 傲骨贤妻在线观看免费完整版| 白化农场| 男性按摩师| 重生九零全集免费| 藏身之所| 2对1:三人一次性体检在线观看中文字| 幸福到万家电视剧在线观看21| 松花江上歌曲| 高清楠木邸的神明庭院| 相亲相爱20160808| 插曲的痛60集全集免费| 拔掉57颗牙是什么体验| 黑崎直步| 二媳妇的味道| 张学良新传| 血族第三季在线观看| 尼基塔 电影| 骄阳伴我 电视剧| jizZ日本| 二人转短剧不孝儿女| 未完全侦探| 美国伦理《性暴行》| 普门品全文念诵及回向全文| 高清高等教欲| 铁齿铜牙纪晓岚二部全集在线观看| 年轻保姆1韩国| 法国空乘2017无删减版| 心理罪 电影| 高清《满意度》电影完整版免费观看| 《需要爸爸播种子》演员全名单| 唐朝浪漫英雄下载| 越狱 电影| 东山再起| 嗜血狂魔2012| 邻家女人丈夫不在的日子结局| 抗美援朝保家卫国纪录片| 奇妙的朋友 综艺| 《千金与佣人》| 韩国电影《美发店的秘密| 强者风范电视剧免费观看| 三年成全免费观看大全动漫| 黑帮总裁| 《超人》| 给父亲播种| 台剧《过界爱》在线观看全集| 《万物生》在线观看| 终极格斗4完整版在线观看| 捉妖记bt| 桑德拉·拉索《啄木鸟》| 女女免费观看电视剧高清| 青春期的妹妹免费观看电视剧| 牛鞭50厘米擦进女人体内爽吗| 亲密 电影| 牧师讲道2024年最新讲道视频| 星克莱尔《妄想症》| 火口的两人全集免费观看| 奔腾年代免费观看全集完整版| 扮猪吃虎:隐藏大佬短剧全集| 瓦尼塔斯的手记动漫在线观看| 《炸天小姐》电影免费| 致美丽的你插曲| 桂宝之爆笑闯宇宙| 坎佩奇在线播放免费观看| 九重紫电视连续剧免费观看高清 | 白袜子俱乐部| 高清小先知| 夺命高楼| 最终幻想动漫| 朴亚珍| 《关照丈夫的上司》大结局 | 韩国电影房产销售的秘密| 加勒比海盗免费| 邵氏经典《妲己》| 换脸-欧阳娜娜《秘书工作指南》-自慰明星女神 | 李恩珠 红字| 财经聪哥| 娃娃脸5在线观看完整免费高清原声满 | 傲雷雷神2| 韩国电影修理工的外遇| 照亮你电视剧免费观看星辰影视 | 牛仔裤的夏天1| 高压监狱在线观看完整免费高清原声满天星2019 | 周弘版《村枝》mv免费观看| 目光所及之处| 妙妙米奇屋| 香港三级片桃色凶器| 小别离电视剧免费观看| 一念关山在线观看免费| 麦乐蒂女超人| 战狼行动| 善良的嫂子2韩国| 法国版《少女感》完整版| 挤痘大师| 香香公主| 掌中之物| 两个女人 qvod| 中央台元宵晚会| 《需要爸爸播种子》电影免费在线观看,高清完整版美国倫理片_努努影院 | 孤舟免费观看完整版电视剧| 我在大学修文物未删减| 女角斗士1满天星版在线观看| 道士出山3外星古墓| 姨母辅导高清版| 伦理《高压监狱2》完整| 沉睡谷第二季| 沧元图第一季免费全集在线观看| 暴躁少女完整版视频在线观看 | 手铐钥匙| 《激战丛林》完整版在线观看| 八毫米电影无删减版在线观看| 无名世界的终结电影免费观看 | 《法国空乘10》完整| 中国人已着手在月球生产水了| 驱魔人百度影音| 朋友家的麦子2中文版配音| 《灵魂摆渡十年》免费| 高清《四大元素之水之魅影》电视剧 | 恐怖大师| 《美丽妻子替夫还债》剧免费观看韩 | 美女收藏家| 欧美日韩电影维修工的艳遇5| 狂飙38集| 雷洛五亿探长1普通话免费观看| 智取威虎山电影| 高清泰迪熊 第二季| 黑白配视频免费大全在线观看| 铎字怎么读| 没什么大不了电影| 法国高压监狱2完整免费| 《哺乳》电影完整版观看免费视频| 宝贝女孩电影免费观看完整版高清 | 酒店1—100集免费观| 初恋这件小事国语版| 如果不是本命就好了未删减| 无限斯特拉托斯第二季| 电影危机航线免费观看| 《揉胸按摩》在线播放| 流星花园日版| 路南柯歌词什么意思| 黑白配国语版免费观看中文版| 高清《蜜桃成熟时2》在线观看| 美国派8| 私人航空电影在线观看完整版高清 | 倔强的花子与驱魔师| 神探狄仁杰四全集免费| 韩国电影《美人》| 播放 - 女律师的堕落高清 - 剧情电影 - 973影视 | 人袁泰山1995出版意大利免费观看 | 后宅争斗:主母不好当短剧全集 | 康熙王朝50集全集高清| 《理发:特殊待遇》孙婉| 王子变青蛙免费观看全集| 盟约电影免费完整版在线观看| 狂野的需求| 聚会的目的3高清完整版在线播放 向风而行电视剧免费播放观看 | 步步惊心电视剧| 笑功震武林 电影| 村上沙的兽皇四全部演员表介绍图片| 拳王粤语下载| 试爱房奴《高潮》4| 天巡者电视剧在线观看免费 | 不在犯罪现场电视剧| 《机械师6》在线观看高清免费 | 波多野吉衣在线播放| 生死劫电视剧| 红场阅兵2025| 车水马龙电影免费版| 蓝翔家族互相举报史| 电影《需要爸爸播种美国》相似的片段 | 味道食在乡| 法国啄木鸟灭火行动| 混血美女按摩视频在线观看| 百万新娘全集| 武庚纪 动漫| 男人女人一起愁愁愁电视剧观看在 | 丰乳肥臀| 韩版欺诈游戏| 真实伦 乱| 天海翼女教师在线播放| 小小诊所完整版| 胜者即是正义2| 燃罪电视剧免费播放| 叶罗丽时间与免费观看完整版| 总统夫人在线观看罗丽星克莱尔| 法国空乘11未删减版在线观看| 杀手记忆 第一季电视剧| 嘉峪关在线网| 大决战49集在线播放影院| 公公浮之手| 高清《厨房》| 跑男第十二季免费播放| 三姐妹招聘男保姆| 异形2百度影音| 《法国少女农场》| 皖乡食妹| 怀念战友原唱歌词| 伴侣交换| 囧的呼唤97| 《我的不良义姐》动漫版百度云| 花甲房东真人版免费看| 我家的天使国语| 萌宝寻爹全集免费| 艾克赛德| 尾崎爱花| 《丰满的女学生3| 电影朋友的妈妈| 电视剧少年白马醉春风全集免费观看| 李连杰电影全集高清| 铁血战士3| 黑白配国语版免费观看全集| 和讨厌的部长一起去出差旅的电影日剧| 我的老婆是大佬3国语| 我和我的家乡免费版观看| 上位4完整版| 千金女贼电视剧| 驯服小峓子2丽卡无删减播放| 世上只有妈妈好免费观看第一集| 女超人(啄木鸟)满天星百度网盘| 毒女电影| 天天躁狂AAAA| 长相依原唱| yellow视频免费观看| 第一拽妃| 上瘾泰国版电视剧| 狂野时代电影| 电视诗歌散文| 高清《恶魔人》动漫| 《扫黑·决战》电影| 法国空乘11未删减版在线观看| 我爱妹妹网| 名侦探柯南沉默的15分钟国语版 | 知不知道简谱| 法国高压监狱3完整版| 电视剧青河绝恋| 高清《我要上你》电影免费观看| 男女一起免费观看全集高清完整版 | 我出生在伊朗| 和台湾这次打得起来吗| 死之咏赞电视剧免费观看完整版| 杨钰莹情陷红楼| 手工皮具制作| 哥谭第三季| 姐妹牙医免费完整版观看| 燕赵刑警| 亲爱的热爱的电视剧观看| 仁心俱乐部分集剧情介绍电视猫| 《最高的爱人诏》三上解说| 爱上黑道女| 埃及猫原版动画| 瞳孔中的暗杀者普通话版免费| 品三国mp3| 小蜜桃6观看免费高清版电视剧| 历年出生人口一览表| 巜与上司的妻子佐佐木| 分娩按摩| 廉洁自律座右铭| 明日战记在线观看免费完整版| 史前战纪第一季在线观看完整版| 我需要爸爸播种子英文hd版意大利电影在线观看| 为有暗香来电视剧| 行尸走肉1| 铜铜铜铜锏铜铜铜铜锵锵锵锵| 死神229| 意大利电影《热体》| 三年成全免费完整版电视剧| 锦鲤少女:好运连连旺全家短剧全集| 香港生孩子费用| 农民伯伯下乡2国语版百度云| 白峰美羽高傲女教师| 大象电视剧| 登顶后位:宫斗步步为营全集免费| 情逢敌手| 欲把老师变舅妈| 一个女被3个男人轮流打耳光| 突然的喜欢电视剧免费观看| 热浪滚汤在线观看| 她的神话 电视剧| 不扣扣的女孩| 四位少妇按摩的电影| oh透明人间| 不可思议的录像带| 突围免费完整版在线观看| 女超人满天星版麦乐迪完整版| 旧日之罪完整版在线观看| 高清维珍朋克:发条女孩未删减 | 守护解放西第三季在线观看| 囧探佳人下载| 娃娃脸9姑娘9| 女同学的滋味在线免费观看| 开心农村| 美国队长4在线观看| 掌心里的海| 咱们结婚吧29| 我需要爸爸种子英文| 菲律宾女同恋爱剧富家千金| 纵有疾风起40集免费观看| 银魂188| 何以笙箫默免费观看全集 | 官能复仇电影| 班长殿下电视剧免费| 小猪佩奇的动画片| 徐若瑄天使三部曲| 特战荣耀 电视剧| 日本调情按摩在线观看| 冲上云霄2土豆| 风流小姨子电影| 向风而行电视剧免费观影| 保你平安| 逛新城简谱| 需要爸爸播种免费看| 欧美1一5美国语| kaera uehara| 关秀媚最大牺牲的一部戏是什么| 电影太太度假时| 黑帮少爷爱上我第七集在线观看| 公公的浮生手中字电影完整版在线| 3对一3人一次性体检| 高清《年轻的嫂子》| 电视剧纵横四海| 局长从后面握住我的奶| 电视剧城中之城| 《理想之城》第二部| 《激战丛林》在线播放免费观看 | 女律师替丈夫还债| 丹麦娇娃| 中文在线翻译| 凶兆2006| 上位2下载| 女人的战争之肮脏的交易U| 地铁迷情| 案发现场第2部| 特殊的保险销售员2| 李翊君北京演唱会| 寡妇女人免费观看全集高清电视剧| 朋友的姐姐免费看| 《我游泳女教练》| 舞乐传奇全集| 变形金刚 高清| 中文字Dl幕岳 和女胥在线播放| 《魔法蓝精灵》| 电视剧霸道总裁推荐| 海军大院| 浴火奔腾浴红| 男按摩师A片| 无间在线电视剧免费观看| 勇敢的心电影在线观看免费完整版| 古代掌柜:开店赚遍全京城短剧全集| 鲁佩的玫瑰免费观看| 星际之门 第一季| 碟中谍1未删减版资源| 《千金赤子板栗》完整版百度网盘| 沉香如屑完整版免费高清| 偷尝禁果在线观看| 印度电影 天生一对| 盛唐风流电影完整版| 电影《干柴烈火》| 莺长的女儿未删减版| 花千骨全集未删减版在哪里可以看| 《欲乱上班族》在线观看|