模型
#include
ftok()
//獲取key值, key值是System V IPC的標識符,成功返回key,失敗返回-1設(shè)errno//同pathname+同 proj_id==>同key_t;key_t ftok(const char *pathname, int proj_id);
pathname?:文件名
proj_id: 1~255的一個數(shù),表示project_id
key_t key=ftok(".",100); //“.”就是一個存在且可訪問的路徑, 100是假設(shè)的proj_id if(-1==key) perror("ftok"),exit(-1);
semget():
//創(chuàng)建/獲取一個信號量集,成功返回semid,失敗返回-1int semget(key_t key, int nsems, int semflg);
nsems: 信號量集的大小/信號量的個數(shù),0表示獲取已經(jīng)存在的信號量集
semflg
- IPC_CREAT?:若不存在則創(chuàng)建, 需要在msgflg中"|權(quán)限信息"; 若存在則打開
- IPC_EXCL?:若存在則創(chuàng)建失敗
- 0?:獲取已經(jīng)存在的信號量集
//create semsemid=semget(key,1,IPC_CREAT|IPC_EXCL|0664);if(-1==semid) perror("semid"),exit(-1);
semctl()
//主要用于對指定的信號量集/信號量執(zhí)行指定的操作,成功返回0,失敗返回-1設(shè)errnoint semctl(int semid, int semnum, int cmd, ...);
semid: 信號量集的編號(哪個信號量集)
semnum: 信號量集的下標(這個信號量集里的哪個信號量)
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)中,同時更新sem_ctime成員
- IPC_RMID?立即銷毀指定的信號量集,調(diào)用的進程的的effective UID必須和信號量集的創(chuàng)建者或所有者相匹配,或者這個進程有足夠的特權(quán)級別,此時第四個參數(shù)會被忽略
- IPC_INFO(Linux-specific)返回系統(tǒng)對信號量集的限制到__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)中存在的信號量集的數(shù)目,semaem返回系統(tǒng)中所有信號量集中的信號量總數(shù)
- SEM_STAT(Linux-specific)返回semid_ds結(jié)構(gòu),類似與IPC_STAT
- GETALL?返回所有信號量的semval到arg.array中,忽略semnum
- GETNCNT?返回信號量集第semnum個信號量的semcnt值
- GETPID?返回信號量集第semnum個信號量的sempid值
- GETVAL?返回信號量集第semnum個信號量的semval值
- GETZCNT?返回信號量集第semnum個信號量的semzcnt值
- SETALL?使用arg.array設(shè)置信號量集里的所有的信號量的semval值,同時更新信號量集的semid_ds結(jié)構(gòu)體的sem_ctime成員的值
- SETVAL返回信號量集第semnum個信號量的semval的值到arg.val中,同時更新信號量集的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():
//操作指定的信號量集,成功返回0,失敗返回-1設(shè)errnoint semop(int semid, struct sembuf *sops, unsigned nsops);
semid:信號集的ID(returned by semget())
sops:結(jié)構(gòu)體指針, 既可以指向結(jié)構(gòu)體變量, 也可以指向結(jié)構(gòu)體數(shù)組?信號量集本質(zhì)上是若干個信號量的集合, 可以實現(xiàn)對信號量的批處理
struct sembuf{ unsigned short sem_num; //信號量集的下標 short sem_op; //正數(shù)表示增加, 0表示不變, 負數(shù)表示減小 short sem_flg; //操作標志,默認給0}
nsops:結(jié)構(gòu)體指針指向的元素個數(shù), 也就是數(shù)組的大小
例子
Sys V IPC sem#include
評論
查看更多