创建信号灯:
int sem_init(sem_t *sem, int pshared, unsigned int value);
sem表示信号灯的一些信息,类似于进程的PCB。
pshared表示是否为多进程所共享,而不仅仅是一个用于一个进程,linux Thread下没有实现多进程的信号灯共享,所以这个值一般为0,否则会返回-1错误值。
value表示信号灯的数量。
注销信号灯:
int sem_destroy(sem_t *sem);
sem表示要注销的信号灯。
获取灯值:
int sem_getvalue(sem_t *sem, int *sval);
读取sem灯的灯计数。
点灯操作:
int sem_post(sem_t *sem);
给灯值原子加1,表示增加了一个可用的资源。
灭灯操作:
int sem_wai(sem_t *sem);
int sem_trywait(sem_t *sem);
这两个都是将信号灯的原子值减1,表示减少一个可用的资源。但这两个也是有区别的:如果当信号灯的原子值小于或等于0,使用sem_trywait()时不会使线程阻塞,而sem_wait()时将会使线程阻塞。
有关信号灯的操作一般都在头文件
当中,下面是人sem_t的结构体定义:
typedef union
{
char __size[__SIZEOF_SEM_T];
long int __align;
} sem_t;
在进程通信当中,我经常会用到信号灯的操作,为此,我小结一下:信号灯有无名信号灯和有名信号灯,我们仅讨论无名信号灯,创建信号灯:int sem_init(sem_t *sem, int pshared, unsigned int value);sem表示信号灯的一些信息,类似于进程的PCB。pshared表示是否为多进程所共享,而不仅仅是一个用于一个进程,linux Thread下没有实现多进程的信