資源簡介
代碼實現了共享內存和信號量的結合,實現進程間通信及其同步問題。通過此代碼可以理解共享內存及信號量基本函數的使用及實現原理。
代碼片段和文件信息
#include?“semtest.h“
static?int?comm_sem(?int?numsint?semflag)
{
????key_t?key?=?ftok(SEM_PATHNAMESEM_PROJ_ID);
????if(key?0)
????{
????????perror(“ftok“);
????????return?-1;
????}
????int?semid?=?semget(key?nums?semflag);
????if(semid?0)
????{
????????perror(“semget“);
????????return?-1;
????}
????return?semid;
}
int?create_sems(int?nums)
{
????return?comm_sem(numsIPC_CREAT|IPC_EXCL|666);
}
int?get_sems(int?nums)
{
????return?comm_sem(numsIPC_CREAT);
}
union?semun{
????int?val;
????struct?semid_ds?*buf;
????unsigned?short?*array;
????struct?seminfo?*?__buf;
};
int?init_sems(int?semid?int?which?int?value)
{
????union?semun?_semun;
????_semun.val?=?value;
????int?ret?=?semctl(semidwhichSETVAL_semun);
????if(ret?0)
????{
????????perror(“init_sem“);
????????return?-1;
????}
????return?0;
}
int?destory_sems(int?semid)
{
????int?ret?=?semctl(semid0IPC_RMIDNULL);
????if(ret?<0)
????{
????????perror(“rm_sem“);
????????return?-1;
????}
????return?0;
}
static?int?comm_sem_op(int?semid?int?which?int?op)
{
????struct?sembuf?_sembuf;
????_sembuf.sem_num?=?which;
????_sembuf.sem_op?=?op;
????_sembuf.sem_flg?=?0;
????return?semop(semid&_sembuf1);
}
int?P(int?semidint?which)
{
????return?comm_sem_op(semidwhich-1);
}
int?V(int?semid?int?which)
{
????return?comm_sem_op(semidwhich1);
}
int?getnums(int?semidint?which){
????int?ret;
????int?value;
????union?semun?_semun;
????printf(“111?which?===?%d?value?===?%d\n“which_semun.val);
????ret?=?semctl(semidwhichGETVAL_semun.val);
????value?=?_semun.val;
????printf(“222?which?===?%d?value?===?%d\n“which_semun.val);
????return?ret;
}
評論
共有 條評論