您的位置:首页 > 编程语言

信号量编程心得 共享内存增加、减小心得 2010.9.10

2010-09-10 15:24 316 查看
2010.9.10
1.信号量(Semaphore)是一个防止共享内存被多个进程或者同一进程的多个线程同时读、写而设置的一个信号开关。
功能类似,停车场。比如有3个车位同时有五辆汽车准备停靠。
信号量就像停车场的管理员,当他发现三个车位满员后,就会落下栏杆。让后面的汽车等待,而非进入停车场停靠。

2.sem_t *sem_open(const char *name, int oflag,/* unsigned long mode, unsigned int value */);
name:信号量名称,信号量唯一标示,为兼容性考虑,一般以/开头
oflag:O_RDWR读写方式打开
O_CREAT如果不存在则创建
O_EXCL如果O_CREAT同时被设置,那么信号量如果已存在,就返回失败
mode一般设置为S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH,表示共享内存的访问权限。
value:信号量初值,通常为1.
返回值:
成功 返回句柄
失败 返回SEM_FAILED 错误码 errorno

打开信号量时mode,value参数不需要

例子:
创建:
Sem_t *pCurSem = sem_open(pSemName, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR, 1);
打开:
pcur_sem = sem_open(pSemName, O_CREAT | O_RDWR);

3.每次创建、或者打开后,标志位的值默认为1。表明此时正在有人使用,务必注意:
无论你是创建、打开,使用完后都必须用sem_post来释放信号量。
否则,此信号量始终为1,即:一直有人在使用。

4.Sem_t 结构体的头文件为: #include <semaphore.h>

5.要增加或者减少共享内存时,内存一旦要变化(操作)。必须重新关联(mmap),在关联前必须将之前关联给删除(munmap)。

6 int ftruncate(int fd,off_t size);
fd:shm_open得到的共享内存句柄
size:内存大小
返回值:成功 返回0 失败 返回-1 错误码errno
设置共享内存大小,一般在初始时使用,增加、减少共享内存,无需对其进行设置。
只要在shm_open中将第二个size_t类型的参数,改变其值就行了。

7.无论文件操作、共享内存操作、信号量操作。理论上所有创建、打开都要在此功能完成后进行关闭或者删除。
功能可以是整体功能,和零散功能。例如创建、读、写。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: