信号灯集
概念
信号灯也叫信号量,是不同进程间或一个给进程内部不同线程间同步的机制
System V信号灯集是一个或者多个信号灯的一个集合。其中的每一个都是单独的计数信号灯。而Posix信号灯指的是单个计数信号灯。
通过信号灯集实现共享内存的同步操作
创建步骤
创建key值 key_t key key=ftok(文件,字符)
创建打开信号灯集 semid=semget(key,信号灯集的数量,权限)
初始化信号灯集 semctl(semid,信号灯集的编号,SETVAL,共用体)
pv操作 semop(semid,&buf,要操作的信号灯的个数)
struct sembuf buf={要操作的编号,pv操作,0阻塞}
union semun{
int val;
};
//初始化
void semit(int semid,int num,int val)
{
union semun sem;
sem.val=val;
semctl(semid,num,SETVAL,sem);
}
//pv操作
void sem_op(int semid,int num,int op)
{
struct sembuf buf;
buf.sem_num = num;
buf.sem_op = op;
buf.sem_flg=0;
semop(semid,&buf,1);
}
消息队列
特点
消息队列就是一个消息列表,用户可以在消息队列中添加消息,读取消息
消息队列可以按照类型来发送/接收消息
在linux下消息队列大小有限制
消息队列的个数最多16个
总容量最多16384字节
每个消息内容最多8192字节
步骤
创建key值 key_t key; key=ftok("文件”,‘a’);
创建或打开消息队列 msgget(key,权限(IPC_CREAT|IPC_EXCL|0666));
添加消息(写消息) msgsnd(msqid,&msg,大小,0(发送完才有返回值));
读取消息 msgrcv(msgrcv,&msg,大小,0(若无消息函数会一直堵塞));
删除消息队列 msgctl(msgid,IPC_REID,NULL);
struct msgbuf
{
long mtype;//消息类型
char ch[32];//消息正文
int num;
};
int main(){
struct msgbuf msg={100,"hello",10};
int msgid;
msgid=msgget(key,IPC_CREAT|IPC_EXCL|0666);