1. POSIX 信号量 与 IPC 信号灯之间比较
| 功能 | POSIX信号量 | IPC信号灯 |
| 定义 | sem_t sem1 | semget |
| 初始化 | sem_init | semctl |
| P操作 | sem_wait | semop |
| V操作 | sem_post | semop |
信号灯的IPC对象是一个信号灯集合,包含了多个信号量,多有的函数都是对一个集合的操作。
2. semget函数
头文件:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
函数原型:int semget(key_t key, int nsems, int semflg)
参数:
key:和信号灯关联的key值
nsems:信号灯集合包含的信号灯数量
semflg:信号灯集合访问权限
返回:成功:信号灯集ID,出错-1
函数原型:int semop(int semid, struct sembuf *opsptr, size_t nops)
函数参数:
semid:信号灯集ID
struct sembuf{
short sem_num;//要操作的信号灯编号
short sem_op;//0,,等待,直到信号灯的值变成0. //1:释放资源,V操作。 //-1:分配资源,P操作
short sem_flg;// 0,IPC_NOWAIT, SEM_UNDO
};
nops:要操作的信号灯个数
返回:成功0,出错-14. semctl函数
原型:int semctl(int semid, int semnum, int cmd, ...union semun arg)
参数:semid 信号灯集合ID
semnum:要修改的信号灯编号
cmd:GETVAL获取信号灯的值
SETVAL设置信号灯的值
IPC_RMID从系统中删除信号灯集合
返回:成功0,出错-1
union semun{
int val; //SETVAL:设置信号灯的值
struct semid_ds *buf; //
unsigned short *array;
struct seminfo *buf;
}
5. 示例:创建信号灯,并查看
#include "sys/types.h"
#include "sys/sem.h"
#include "signal.h"
#include "unistd.h"
#include "stdio.h"
#include "stdlib.h"
int main()
{
int semid;
semid=semget(IPC_PRIVATE,3,0777);
if(semid <0)
{
printf("creat semaphore failure\n");
return -1;
}
printf("creat semaphore sucess semid=%d\n",semid);
system("ipcs -s");
//while(1);
// delete semaphore
semctl(semid,0,IPC_RMID,NULL);
system("ipcs -s");
return 0;
}
执行结果:
alex@alex-VirtualBox:~/Share/process/nineteen$ gcc sem.c
alex@alex-VirtualBox:~/Share/process/nineteen$ ./a.out
creat semaphore sucess semid=0
------ Semaphore Arrays --------
key semid owner perms nsems
0x00000000 0 alex 777 3
------ Semaphore Arrays --------
key semid owner perms nsems
alex@alex-VirtualBox:~/Share/process/nineteen$
本文对比了POSIX信号量与IPC信号灯的功能、定义、初始化及操作方法,并详细介绍了IPC信号灯中的semget、semop及semctl函数用法,通过示例展示了信号灯的创建与查看过程。
622

被折叠的 条评论
为什么被折叠?



