信号灯的创建或打开 semget函数
函数原型: int semget(key_t key, int nsems, int semflg);
//创建一个信号灯集或打开一个已经存在的信号灯集
所需头文件:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
函数参数:
key:和信号灯集关联的key值
nsems: 信号灯集中包含的信号灯数目
semflg:信号灯集的访问权限
函数返回值:
成功:信号量灯集ID
出错:‐1
代码:
semget.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <stdlib.h>
int main()
{
int semid;
semid = semget(IPC_PRIVATE,3,0755|IPC_CREAT);
if(semid < 0)
{
printf("semaphore create failure\n");
perror("why");
return -1;
}
printf("semaphore create semid = %d\n",semid);
system("ipcs -s");
return 0;
}
执行结果:
信号灯集的删除 semctl函数
函数原型:int semctl ( int semid, int semnum, int cmd,…union semun arg(不是地址));
//控制信号灯集,删除信号灯集或初始化信号灯集
所需头文件:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
函数参数:
semid:信号灯集ID
semnum: 要修改的信号灯编号
cmd :
GETVAL:获取信号灯的值
SETVAL:设置信号灯的值
IPC_RMID:从系统中删除信号灯集
函数返回值:
成功:0
出错:‐1
代码:
semctl.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <stdlib.h>
int main()
{
int semid;
key_t key;
key = ftok("d.c",1);
semid = semget(key,3,0755|IPC_CREAT);
if(semid < 0)
{
printf("semaphore create failure\n");
perror("why");
return -1;
}
printf("semaphore create semid = %d\n",semid);
system("ipcs -s");
semctl(semid,0,IPC_RMID,NULL);
system("ipcs -s");
return 0;
}
执行结果: