日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

UNIX多用戶系統(tǒng)下信號(hào)量操作詳解( 二 )


int sid; /*信號(hào)量集合標(biāo)識(shí)符*/
int count; /*信號(hào)量集合中元素個(gè)數(shù)*/
ushort *arg; /*命令參數(shù)*/

該命令把數(shù)組arg中的前count個(gè)值依次賦給集合中各信號(hào)量,一次可設(shè)定多個(gè)信號(hào)量的初值 。

若用SETVAL命令,其格式為:

int semctl(sid,semnum,SETVAL,arg)
int sid; /*信號(hào)量集合標(biāo)識(shí)符*/
int semnum; /*信號(hào)量元素編號(hào)*/
int arg; /*命令參數(shù)*/

該命令將arg的值賦給集合中第semnum個(gè)信號(hào)量,一次僅能設(shè)定一個(gè)信號(hào)量的初值 。

③查詢信號(hào)量集合的當(dāng)前值

查詢信號(hào)量集合的當(dāng)前值可用GETALL或GETVAL命令 。若用GETALL命令,其格式為:

int semctl(sid,count,GETALL,arg)
int sid; /*信號(hào)量集合標(biāo)識(shí)符*/
int count; /*信號(hào)量集合中元素個(gè)數(shù)*/
ushort *arg; /*命令參數(shù)*/

該命令把信號(hào)量集合中各信號(hào)量的當(dāng)前值返回到數(shù)組arg中 。

若用GETVAL命令,其格式為:

int semctl(sid,semnum,GETVAL,0)
int sid; /*信號(hào)量集合標(biāo)識(shí)符*/
int semnum; /*信號(hào)量元素編號(hào)*/

該命令把集合中第semnum個(gè)信號(hào)量的當(dāng)前值作為調(diào)用的返回值 。

④查詢某個(gè)信號(hào)量的等待進(jìn)程數(shù)

當(dāng)一個(gè)進(jìn)程要執(zhí)行信號(hào)量操作時(shí)若條件不具備則被阻塞,有關(guān)信號(hào)量的等待進(jìn)程數(shù)也相應(yīng)變化 。

通過(guò)GETNCNT命令可查詢等待信號(hào)量增值的進(jìn)程數(shù),其格式如下:

int semctl(sid,semnum,GETNCNT,0)
int sid; /*信號(hào)量集合標(biāo)識(shí)符*/
int semnum; /*信號(hào)量元素編號(hào)*/

該命令把等待第semnum個(gè)信號(hào)量增值的進(jìn)程數(shù)作為調(diào)用的返回值 。

通過(guò)GETZCNT命令可查詢等待信號(hào)量值為0的進(jìn)程數(shù),其格式如下:

int semctl(sid,semnum,GETZCNT,0)
int sid; /*信號(hào)量集合標(biāo)識(shí)符*/
int semnum; /*信號(hào)量元素編號(hào)*/

該命令把等待第semnum個(gè)信號(hào)量值為0的進(jìn)程數(shù)作為調(diào)用的返回值 。

至于其它的控制命令,因不常用而不再累述 。

系統(tǒng)調(diào)用semop用來(lái)對(duì)信號(hào)量集合中的一個(gè)或多個(gè)信號(hào)量進(jìn)行操作,操作命令由用戶提供的操作結(jié)構(gòu)數(shù)組來(lái)定義,該結(jié)構(gòu)如下:

struct sembuf{
short sem_num; /*信號(hào)量在集合中的下標(biāo)*/
short sem_op; /*操作值*/
short sem_flg; /*操作標(biāo)志*/
};

系統(tǒng)從用戶地址空間讀信號(hào)量操作結(jié)構(gòu)數(shù)組,并核實(shí)信號(hào)量下標(biāo)的合法性及進(jìn)程是否具備讀或修改信號(hào)量所必需的權(quán)限 。若權(quán)限不夠則調(diào)用失敗;若進(jìn)程必須睡眠,則它將已操作過(guò)的信號(hào)量恢復(fù)為該系統(tǒng)調(diào)用開(kāi)始時(shí)的值,然后它就睡眠,直到它等待的事件發(fā)生時(shí)再重新執(zhí)行該系統(tǒng)調(diào)用 。由于系統(tǒng)將操作數(shù)組保存在一個(gè)全局?jǐn)?shù)組中,因此若它必須重新執(zhí)行該調(diào)用的話,它必須重新從用戶空間讀該數(shù)組 。這樣,操作按原語(yǔ)方式執(zhí)行--或一次做完或根本不做 。

系統(tǒng)根據(jù)操作值來(lái)改變信號(hào)量的值:①若操作值為正,系統(tǒng)就增加信號(hào)量的值并喚醒所有等待信號(hào)量增值的進(jìn)程;②若操作值是0,系統(tǒng)就檢查信號(hào)量的值:如果為0,就繼續(xù)數(shù)組中的其它操作;否則把等待信號(hào)量的值為0的睡眠進(jìn)程數(shù)加1,然后睡眠;③若操作值為負(fù)且其絕對(duì)值不超過(guò)信號(hào)量的值,系統(tǒng)就把操作值(一個(gè)負(fù)數(shù))加到信號(hào)量值上,如果結(jié)果為0則系統(tǒng)就喚醒所有等待信號(hào)量的值為0的睡眠進(jìn)程;④若信號(hào)量的值小于操作值的絕對(duì)值,系統(tǒng)就讓進(jìn)程睡眠在"等待信號(hào)量增值"這一事件上 。

當(dāng)進(jìn)程在信號(hào)量操作過(guò)程中睡眠時(shí),它睡眠在可中斷級(jí)上,因此當(dāng)它接收到軟中斷信號(hào)時(shí)就被喚醒了 。用戶可在操作標(biāo)志中設(shè)置IPC_NOWAIT標(biāo)志以防止進(jìn)程睡眠 。

如果進(jìn)程執(zhí)行了一個(gè)信號(hào)量操作,鎖住了某些資源,卻沒(méi)有恢復(fù)信號(hào)量的值就退出了(如收到kill信號(hào)),那么就可能出現(xiàn)危險(xiǎn)情況 。為了避免這類問(wèn)題,用戶可在操作標(biāo)志中設(shè)置SEM_UNDO標(biāo)志 。當(dāng)進(jìn)程退出時(shí),系統(tǒng)便撤除該進(jìn)程做過(guò)的每個(gè)信號(hào)量操作的影響 。

推薦閱讀