模型
#include
ftok()
//獲取key值, key值是System V IPC的標(biāo)識(shí)符,成功返回key,失敗返回-1設(shè)errno//同pathname+同 proj_id==>同key_t;key_t ftok(const char *pathname, int proj_id);
pathname?:文件名
proj_id: 1~255的一個(gè)數(shù),表示project_id
key_t key=ftok(".",100); //“.”就是一個(gè)存在且可訪問的路徑, 100是假設(shè)的proj_id if(-1==key) perror("ftok"),exit(-1);
semget():
//創(chuàng)建/獲取一個(gè)信號(hào)量集,成功返回semid,失敗返回-1int semget(key_t key, int nsems, int semflg);
nsems: 信號(hào)量集的大小/信號(hào)量的個(gè)數(shù),0表示獲取已經(jīng)存在的信號(hào)量集
semflg
- IPC_CREAT?:若不存在則創(chuàng)建, 需要在msgflg中"|權(quán)限信息"; 若存在則打開
- IPC_EXCL?:若存在則創(chuàng)建失敗
- 0?:獲取已經(jīng)存在的信號(hào)量集
//create semsemid=semget(key,1,IPC_CREAT|IPC_EXCL|0664);if(-1==semid) perror("semid"),exit(-1);
semctl()
//主要用于對(duì)指定的信號(hào)量集/信號(hào)量執(zhí)行指定的操作,成功返回0,失敗返回-1設(shè)errnoint semctl(int semid, int semnum, int cmd, ...);
semid: 信號(hào)量集的編號(hào)(哪個(gè)信號(hào)量集)
semnum: 信號(hào)量集的下標(biāo)(這個(gè)信號(hào)量集里的哪個(gè)信號(hào)量)
cmd:具體的操作命令
- IPC_STAT?將內(nèi)核中與semid相關(guān)的信息拷貝到arg.buf指向的結(jié)構(gòu)體中
- IPC_SET將buf指向的semid_ds結(jié)構(gòu)體的部分內(nèi)容寫入到內(nèi)核中的相關(guān)數(shù)據(jù)結(jié)構(gòu)中,同時(shí)更新sem_ctime成員
- IPC_RMID?立即銷毀指定的信號(hào)量集,調(diào)用的進(jìn)程的的effective UID必須和信號(hào)量集的創(chuàng)建者或所有者相匹配,或者這個(gè)進(jìn)程有足夠的特權(quán)級(jí)別,此時(shí)第四個(gè)參數(shù)會(huì)被忽略
- IPC_INFO(Linux-specific)返回系統(tǒng)對(duì)信號(hào)量集的限制到__buf指向的結(jié)構(gòu)體seminfo中
//_GNU_SOURCEstruct seminfo { int semmap; /* Number of entries in semaphore map; unused within kernel */ int semmni; /* Maximum number of semaphore sets */ int semmns; /* Maximum number of semaphores in all semaphore sets */ int semmnu; /* System-wide maximum number of undo structures; unused within kernel */ int semmsl; /* Maximum number of semaphores in a set */ int semopm; /* Maximum number of operations for semop(2) */ int semume; /* Maximum number of undo entries per process; unused within kernel */ int semusz; /* Size of struct sem_undo */ int semvmx; /* Maximum semaphore value */ int semaem; /* Max. value that can be recorded for semaphore adjustment (SEM_UNDO) */};//semmsl, semmns, semopm, semmni可以通過/proc/sys/kernel/sem來設(shè)置
- SEM_INFO?(Linux-specific)返回和IPC_INFO一樣的信息,除了以下方面:semusz成員返回當(dāng)前系統(tǒng)中存在的信號(hào)量集的數(shù)目,semaem返回系統(tǒng)中所有信號(hào)量集中的信號(hào)量總數(shù)
- SEM_STAT(Linux-specific)返回semid_ds結(jié)構(gòu),類似與IPC_STAT
- GETALL?返回所有信號(hào)量的semval到arg.array中,忽略semnum
- GETNCNT?返回信號(hào)量集第semnum個(gè)信號(hào)量的semcnt值
- GETPID?返回信號(hào)量集第semnum個(gè)信號(hào)量的sempid值
- GETVAL?返回信號(hào)量集第semnum個(gè)信號(hào)量的semval值
- GETZCNT?返回信號(hào)量集第semnum個(gè)信號(hào)量的semzcnt值
- SETALL?使用arg.array設(shè)置信號(hào)量集里的所有的信號(hào)量的semval值,同時(shí)更新信號(hào)量集的semid_ds結(jié)構(gòu)體的sem_ctime成員的值
- SETVAL返回信號(hào)量集第semnum個(gè)信號(hào)量的semval的值到arg.val中,同時(shí)更新信號(hào)量集的semid_ds結(jié)構(gòu)體的sem_ctime成員的值
the fourth argument:
union semun { int val; /* Value for SETVAL */ struct semid_ds* buf; /* Buffer for IPC_STAT, IPC_SET */ unsigned short* array; /* Array for GETALL, SETALL */ struct seminfo* __buf; /* Buffer for IPC_INFO(Linux-specific) */};//
int res=semctl(semid,0,SETVAL,5);if(-1==res) perror("semctl"),exit(-1);int res=semctl(semid,0,IPC_RMID);if(-1==res) perror("semctl"),exit(-1);
semop():
//操作指定的信號(hào)量集,成功返回0,失敗返回-1設(shè)errnoint semop(int semid, struct sembuf *sops, unsigned nsops);
semid:信號(hào)集的ID(returned by semget())
sops:結(jié)構(gòu)體指針, 既可以指向結(jié)構(gòu)體變量, 也可以指向結(jié)構(gòu)體數(shù)組?信號(hào)量集本質(zhì)上是若干個(gè)信號(hào)量的集合, 可以實(shí)現(xiàn)對(duì)信號(hào)量的批處理
struct sembuf{ unsigned short sem_num; //信號(hào)量集的下標(biāo) short sem_op; //正數(shù)表示增加, 0表示不變, 負(fù)數(shù)表示減小 short sem_flg; //操作標(biāo)志,默認(rèn)給0}
nsops:結(jié)構(gòu)體指針指向的元素個(gè)數(shù), 也就是數(shù)組的大小
例子
Sys V IPC sem#include
評(píng)論