头文件:
semaphore.h
库:
-pthread
查看:
ls /dev/shm/(所有名字前面都自动加上了sem.)
man sem_overview
命名信号量(基于文件):
创建:
sem_t* sem_open(const char* name,int oflag,mode_t mode,unsigned int value);
name:
信号量IPC名字。
value:
信号量初始值。
返回值:
非SEM_FAILED——信号量指针
SEM_FAILED———出错
打开:
sem_t* sem_open(const char* name,int oflag);
关闭:
int sem_close(sem_t* sem);
sem:
信号量的指针。
返回值:
-1——出错
0——成功
删除:
int sem_unlink(const char* name);
返回值:
-1——出错
0——成功
无名信号量(基于内存):
初始化:
int sem_init(sem_t *sem,int pshared,unsigned int value);
pshared:
共享方式。
0——线程间共享
1——进程间共享(需要共享内存)
value:
信号量初始值。
返回值:
-1——出错
0——成功
销毁:
int sem_destroy(sem_t* sem);
返回值:
-1——出错
0——成功
挂出:
int sem_post(sem_t* sem);
同上
等待:
int sem_wait(sem_t* sem);
同上
尝试等待:
int sem_trywait(sem_t* sem);
同上
获取信号量值:
int sem_getvalue(sem_t* sem,int* sval);
sval:
信号量的值。
代码:
创建:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <semaphore.h>
int main(int argc,char * argv[]){
sem_t* sem = sem_open(argv[1],O_CREAT,0644,atoi(argv[2]));
}
信号量使用(sem_wait):
#include <fcntl.h>
#include <signal.h>
#include <semaphore.h>
void handler(int sig){
printf("PID:%d,prepare to leave\n",getpid());
}
int main(int argc,char * argv[]){
signal(SIGINT,handler);
sem_t* sem = sem_open(argv[1],O_RDWR);
sem_wait(sem);
int val;
sem_getvalue(sem,&val);
printf("PID:%d,enter. park %d\n",getpid(),val);
printf("PID:%d,do something\n",getpid());
pause();
sem_post(sem);
sem_getvalue(sem,&val);
printf("PID:%d,leave. park %d\n",getpid(),val);
}
sem_trywait:
#include <fcntl.h>
#include <signal.h>
#include <semaphore.h>
void handler(int sig){
printf("PID:%d,prepare to leave\n",getpid());
}
int main(int argc,char * argv[]){
signal(SIGINT,handler);
sem_t* sem = sem_open(argv[1],O_RDWR);
if(-1 == sem_trywait(sem)){
perror("no park");
return 1;
}
int val;
sem_getvalue(sem,&val);
printf("PID:%d,enter. park %d\n",getpid(),val);
printf("PID:%d,do something\n",getpid());
pause();
sem_post(sem);
sem_getvalue(sem,&val);
printf("PID:%d,leave. park %d\n",getpid(),val);
}