未加星标

Linux POSIX IPC 有名信号量 无名信号量

字体大小 | |
[系统(linux) 所属分类 系统(linux) | 发布者 店小二05 | 时间 20161001 | 作者 红领巾 ] 0人收藏点击收藏

linux POSIX IPC 有名信号量 无名信号量

模型:
初始化并打开有名信号量:sem_open()
创建/获得无名信号量:sem_init()
操作信号量:sem_wait()/sem_trywait()/sem_timedwait()/sem_post()/sem_getvalue()
退出有名信号量:sem_close()
销毁有名信号量:sem_unlink()
销毁无名信号量:sem_destroy()
头文件
#include<semaphore.h>
#include<sys/stat.h>
#include<fcntl.h>
sem_open()
//创建/打开一个有名信号量,成功返回新信号量的地址,失败返回SEM_FAILED设errno
// <semaphore.h>
//#define SEM_FAILED ((sem_t *) 0
//#define SEM_VALUE_MAX (2147483647)
//Link with -pthread.
sem_t *sem_open(const char *name, int oflag);
sem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value);

oflag

O_CREAT如果信号量不存在就创建信号量,信号量的UID被设为调用进程的effective UID,GID被设为调用程序的GID,可以在mode指定权限
O_EXCL和O_CREAT连用,确保可以创建新的信号量,如果已存在就报错

value :配合O_CREAT使用,设置信号量的初始值

sem_init()
//初始化无名信号量,成功返回0,失败返回-1设errno
//Link with -pthread.
int sem_init(sem_t *sem, int pshared, unsigned int value);
sem 创建无名信号量的指针
pthread指定信号量是在线程间使用还是进程间使用
0表示信号量在一个进程内的线程间使用,此时信号量应该分配的在线程可见的内存区域(eg,全局区,BSS段,堆区)
非0表示信号量在进程间使用,此时信号量应该分配在共享内存里,If pshared !=0,
sem_wait()/sem_trywait()/sem_timedwait()
//Link with -pthread.
//成功返回降低后的信号量的值,失败返回-1设errno
//试图占用信号量,如果信号量值>0,就-1,如果已经=0,就block,直到>0
int sem_wait(sem_t *sem);
//试图占用信号量,如果信号量已经=0,立即报错
int sem_trywait(sem_t *sem);
//试图占用信号量
//如果信号量=0,就block abs_timeout那么久,从 Epoch, 1970-01-01 00:00:00 +0000 (UTC).开始按纳秒计
//如果时间到了信号量还没>0,报错
int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);
struct timespec {
time_t tv_sec; /* Seconds */
long tv_nsec; /* Nanoseconds [0 .. 999999999] */
};
sem_post()
//归还信号量,成功返回0,失败返回-1设errno
//Link with -pthread.
int sem_post(sem_t *sem);
sem_getvalue()
//获得信号量sem的当前的值,放到sval中。如果有线程正在block这个信号量,sval可能返回两个值,0或“-正在block的线程的数目”,Linux返回0
//成功返回0,失败返回-1设errno
//Link with -pthread.
int sem_getvalue(sem_t *sem, int *sval);
sem_close()
//关闭有名信号量,成功返回0,失败返回-1设errno
//Link with -pthread.
int sem_close(sem_t *sem);
sem_unlink()
//试图销毁信号量,一旦所有占用该信号量的进程都关闭了该信号量,那么就会销毁这个信号量
//成功返回0,失败返回-1设errno
//Link with -pthread.
int sem_unlink(const char *name);
sem_destroy()
//销毁信号量,成功返回0,失败返回-1设errno
//Link with -pthread.
int sem_destroy(sem_t *sem);

本文地址:http://www.codesec.net/Linux/2016-10/135803.htm


Linux POSIX IPC 有名信号量 无名信号量

本文系统(linux)相关术语:linux系统 鸟哥的linux私房菜 linux命令大全 linux操作系统

主题: LinuxUTUTC
分页:12
转载请注明
本文标题:Linux POSIX IPC 有名信号量 无名信号量
本站链接:http://www.codesec.net/view/483411.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 系统(linux) | 评论(0) | 阅读(25)