分类: LINUX
2013-01-18 19:35:11
Posix信号灯
1、 函数列表(#include
有名信号灯特异函数
Ø sem_t *sem_open(const char *name, intoflag);
sem_t *sem_open(const char *name, int oflag,mode_tmode, unsigned int value);
此函数创建一个新的信号灯或打开一个已存在的有名信号灯,成功时返回指向信号灯的指针,出错时返回SEM_FAILED。
Oflag可以为0、O_CREATE、O_CREATE|O_EXCL。如果O_CREATE,当信号灯存在时,则不初始化它,当信号灯不存在时,则创建并初始化它。如果O_CREATE|O_EXCL,当信号灯存在时,错误,当信号灯不存在时,则创建并初始化它。
Mode同FIFO的mkfifo函数,指定S_IRUSR| S_IWUSR | S_IRGRP | S_IROTH表示FIFO允许用户读、用户写、组成员读和其他用户读。
Value为信号灯的初始值,二值信号灯的初始值通常为1,计数信号灯的初始值则往往大于1.
Ø int sem_close(sem_t *sem);
此函数用于关闭有名信号灯,成功返回0,失败返回-1。
Ø int sem_unlink(const char *name);
此函数用于删除有名信号灯,成功返回0,失败返回-1.
无名信号灯特异函数
Ø int sem_init(sem_t *sem, int pshared,unsigned int value);
此函数用于初始化基于内存空间的无名信号灯,成功不一定返回0,失败返回-1.
sem参数指向必须由应用程序分配的sem_t变量;
pshared为0时,那么初始化的信号灯是在同一个进程的各个线程间共享的,为1的话就是在进程间共享的,此时该信号灯必须放在即将使用他的所有进程都能访问的某种类型的共享内存区中;
跟sem_open一样,value参数是该信号灯的初始值。
Ø int sem_destroy(sem_t *sem);
此函数用于销毁无名信号灯,成功返回0,失败返回-1.
公共函数
Ø int sem_wait(sem_t *sem);
int sem_trywait(sem_t *sem);
int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);
sem_wait测试所指信号灯,如果该值大于0,则减1并立即返回;如果等于0,调用线程进入休眠;
sem_trywait测试所指信号灯,如果该值大于0,则减1并立即返回;如果等于0,此函数返回EAGAIN错误;
sem_timedwait测试所指信号灯,如果该值大于0,则减1并立即返回;如果等于0,此函数阻塞等待abs_timeout时长,超时时,函数返回ETIMEDOUT错误,在abs_timeout内信号灯值变成大于0,则减1并立即返回。
成功时返回0,失败时返回-1.
Ø int sem_post(sem_t *sem);
给该信号灯的值加1,然后唤醒等待该信号灯值变成正数的任意线程,成功时返回0,失败时返回-1。
Ø int sem_getvalue(sem_t *sem, int *sval);
由sval返回所指定信号灯的值,成功返回0,失败返回-1.