当前位置:首页 > 嵌入式培训 > 嵌入式学习 > 讲师博文 >
信号量的使用和注意事项
时间:2018-08-09作者:华清远见

信号灯(信号量)集

POSIX 线程中的同步用的是无名信号量

进程间的同步使用的是IPC 对象[信号灯集]

信号灯集:信号灯集合,每一个信号灯都可以用来表示一类资源,其值表示资源的个数

(1)创建信号灯集

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

参数:

@key IPC_PRIVATE , ftok()

@nsems 信号灯集中信号灯的个数

@semflg IPC_CREAT | 0666,IPC_CREAT | IPC_EXCL

返回值:

成功返回ID,失败返回-1

(2)初始化信号灯集中信号灯的值

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

参数:

@semid 信号灯集的ID

@semnum 信号灯的编号[编号从0开始]

@cmd SETVAL[设置信号灯的值] ,GETVAL(获取信号灯的值),IPC_RMID[删除信号灯集]

返回值:

成功返回0,失败返回-1

思考:将信号灯集中的1号信号灯初始化为1?

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) */

};

void init_sem_value(int sem_id,int sem_num,int value)

{

union semun sem_val;

sem_val.val = value;

if(semctl(sem_id,sem_num,SETVAL,sem_val) < 0)

{

...

}

return ;

}

(3)PV操作

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

功能:完成PV操作

参数:

@semid 信号灯集的ID

@sops 操作方式结构体首地址

@nsops 操作信号灯的个数

返回值:

成功返回0,失败返回-1

struct sembuf

{

unsigned short sem_num; /* semaphore number */

short sem_op; /* semaphore operation */

short sem_flg; /* operation flags */

};

sem_op :

<1>0 等待信号灯的值变成0

<2>1 释放资源,V操作

<3>-1 申请资源,P操作

sem_flg:

0 : 阻塞方式

IPC_NOWAIT : 非阻塞方式调用

SEM_UNDO : 进程结束的时候,它申请的资源自动释放

void P(int sem_id,int sem_num)

{

struct sembuf sem;

sem.sem_num = sem_num;

sem.sem_op = -1;

sem.sem_flg = 0;

if(semop(sem_id,&sem,1) < 0)

{

....

}

}

void V(int sem_id,int sem_num)

{

struct sembuf sem;

sem.sem_num = sem_num;

sem.sem_op = 1;

sem.sem_flg = 0;

if(semop(sem_id,&sem,1) < 0)

{

....

}

}

练习:A,B通过信号灯集同步对共享内存操作

让创建信号灯集的进程,初始化信号灯的值 ,如果信号灯集已经存在则不初始化

sem_id = semget(key,2,IPC_CREAT | IPC_EXCL | 0666);

if(sem_id < 0)//信号灯集已经,不初始化信号灯值

{

sem_id = semget(key,2,IPC_CREAT | 0666);

}else{

//初始化信号灯集中信号灯的值

}


发表评论

全国咨询电话:400-611-6270,双休日及节假日请致电值班手机:15010390966

在线咨询: 曹老师QQ(3337544669), 徐老师QQ(1462495461), 刘老师 QQ(3108687497)

企业培训洽谈专线:010-82600901,院校合作洽谈专线:010-82600350,在线咨询:QQ(248856300)

Copyright 2004-2018 华清远见教育集团 版权所有 ,京ICP备16055225号,京公海网安备11010802025203号