信号量分类
链接使用-pthread参数
- 无名信号量(基于内存的共享)
- 单进程内多线程之间可以使用(sem_t)全局变量、堆变量,多进程之间使用共享内存(shm_open);
- 不再使用信号量,则在内存释放前,调用sem_destory销毁。
- 使用的函数:
sem_init
sem_post
sem_wait
sem_getvalue
sem_destroy
- 有名信号量(基于内存文件的共享)
- 文件名称形式为:/semaphore_name,首个字符为斜杠,后面为非斜杠字符。文件在目录/dev/shm下,名称长度受到文件名长度限制。
- 文件由sem_open创建或打开,sem_close关闭,sem_unlink删除。若不删除文件,文件可保留至系统关机。
sem_open
sem_post
sem_wait
sem_getvalue
sem_close
sem_unlink
注意点
//pshared=0单进程内多线程间; pshared !=0多进程间。
int sem_init(sem_t *sem, int pshared, unsigned int value);
//立即唤醒阻塞中的wait线程或进程。
int sem_post(sem_t *sem);
//当存在sem_wait阻塞时,value返回值为0(linux)。
int sem_getvalue(sem_t *sem, int *sval);
int sem_wait(sem_t *sem);
//非阻塞, 信号量值为0,立即返回错误,errno=EAGAIN
int sem_trywait(sem_t *sem);
//定时阻塞, 信号量值为0,超时返回错误,errno=ETIMEDOUT
int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);
//销毁信号量之前还若有wait的线程或进程,其行为不可控。
int sem_destory(sem_t *sem);
IPC工具:ipcs、ipcrm、ipcmk
ipcs -s 查看存活的信号量
ipcs -i id 查看详情
ipcs -sl 查看信号量系统限制
ipcrm -s semid
ipcrm -S semkey
icpmk -S number
区分SYSTEM V信号量
- system v信号量使用的是ftok、semget、semop和semctrl。
- 早期的信号量API接口,不建议使用。
- -