IPC--信号量集

IPC通信机制-信号量集


1.int semget(key_t key,int nsems, int semflg);


第一个参数是由ftok()获取的key ,
第二个参数是要创建的信号量的个数,如果是0表示获取信号量集ID
第三个参数是IPC_CREAT,创建信号量集ID。
返回一个信号量集的ID  semid.


semid=semget(key,10,IPC_CREAT|0660);


2. int semop(int semid,struct sembuf *sops,unsigned nsops);


第一个参数是 信号量集的ID,
第二个参数是要操作的结构体;


struct sembuf {
unsinged short sem_num;   要对哪个信号量进行操作  0表示第一个;
short sem_op; 要进行什么操作,正数表示释放信号量,负数表示使用信号量;
short sem_flg; IPC_NOWAIT
}
第三个参数是指 sops 结构体的个数,恒大于或等于1;




3. int semctl(int semid,int semnum,int cmd,...);


第一个参数是信号量集的ID;
第二个参数是对第几个信号量进行操作,0代表第一个;
第三个参数是要进行什么操作;


可以有第四个参数,第四个参数是一个联合:
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) */


}


struct  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) */
};




struct semid_ds {
struct ipc_perm sem_perm;  /* Ownership and permissions */
time_t          sem_otime; /* Last semop time */
time_t          sem_ctime; /* Last change time */
unsigned short  sem_nsems; /* No. of semaphores in set */
};




struct ipc_perm {
key_t          __key; /* Key supplied to semget(2) */
uid_t          uid;   /* Effective UID of owner */
gid_t          gid;   /* Effective GID of owner */
uid_t          cuid;  /* Effective UID of creator */
gid_t          cgid;  /* Effective GID of creator */
unsigned short mode;  /* Permissions */
unsigned short __seq; /* Sequence number */
};




第三个参数:
IPC_STAT 读取一个信号量集的数据结构semid_ds,并将其存储在semun中的buf参数中。
IPC_SET 设置信号量集的数据结构semid_ds中的元素ipc_perm,其值取自semun中的buf参数。
IPC_RMID 将信号量集从内存中删除。
GETALL 用于读取信号量集中的所有信号量的值。
GETNCNT 返回正在等待资源的进程数目。
GETPID 返回最后一个执行semop操作的进程的PID。
GETVAL 返回信号量集中的一个单个的信号量的值。
GETZCNT 返回这在等待完全空闲的资源的进程数目。
SETALL 设置信号量集中的所有的信号量的值。
SETVAL 设置信号量集中的一个单独的信号量的值。




返回值:
根据不同的cmd返回不同的值;


GETNCNT     the value of semncnt.


GETPID      the value of sempid.


GETVAL      the value of semval.


GETZCNT     the value of semzcnt.


其他cmd成功返回0;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值