信号量编程(一)
一、信号量相关的API(1)semget:man2semegt创建或获取一个信号量组:若成功返回信号量集ID,失败返回-1。intsemget(key_t key,int num_sems,int sem_flags);key_t keykeyint num_sems信号量集中的信号量的个数int sem_flags判断信号量是否存在不存在的话,就要创建信号量IPC_CREAT|0666(2)se
·
一、信号量相关的API
(1)semget:
man 2 semegt
创建或获取一个信号量组:若成功返回信号量集ID,失败返回-1。
int semget(key_t key,int num_sems,int sem_flags);
key_t key key
int num_sems 信号量集中的信号量的个数
int sem_flags 判断信号量是否存在
不存在的话,就要创建信号量
IPC_CREAT|0666
(2)semop
man 2 semop
对信号量组进行操作,改变信号量的值,成功返回0,失败返回-1。
int semop(int semid,struct sembuf semoparry[],size_t numops)
(3)semctl
对信号量进行操作
man 2 semctl
int semctl(int semid,int sem_num,int cmd,…)
semid:操作信号量集的id
sem_num:操作第几个信号量
cmd:一般写SETVAL(设置信号量的初值)
第四个参数:定义结构体
类似:
二、代码实现
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/sem.h>
// int semget(key_t key, int nsems, int semflg);
//int semctl(int semid, int semnum, int cmd, ...);
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 main(int argc,char **argv)
{
key_t key;
int semid;//1.设置信号量的id
key=ftok(".",2);
semid=semget(key,1,IPC_CREAT|0666);//2.创建信号量
// 1 代表信号量中只有一个信号量
union semun initsem;//3.设置结构体
initsem.val=1;//4.只有一把锁
semctl(semid,0,SETVAL,initsem);//5.初始化信号量
//0 代表操作第0个信号量
//SETVAL 设置信号量的值,设置为initsem
int pid = fork();
if(pid>0)
{
//去拿锁
printf("this is father \n");
}
//放回锁
else if(pid==0)
{
printf("this is child\n");
}
else
{
printf("fork error\n");
}
return 0;
}
运行结果:
——@上官可编程
更多推荐



所有评论(0)