前一篇使用管道实现信号量,本文使用消息队列实现信号量。其原理和管道一样,都是通过在消息队列里面写入一个字符,读取一个字符。这里就不再多说了,直接上代码。
msg_sem.hpp 文件
#ifndef MSG_SEM_HPP
#define MSG_SEM_HPP
#include<errno.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>
typedef struct msg_sem_tag
{
int fd;
int valid;
}msg_sem_t;
#define MSG_SEM_VALID 0xae3c
int msg_sem_init(msg_sem_t* msg, int num);
int msg_sem_p(msg_sem_t* msg);
int msg_sem_tryP(msg_sem_t* msg);
inline int msg_sem_v(msg_sem_t* msg)
{
if( msg == NULL || msg->valid != MSG_SEM_VALID )
return EINVAL;
return msgsnd(msg->fd, "v", 1, 0);
}
inline int msg_sem_destroy(msg_sem_t* msg)
{
if( msg == NULL || msg->valid != MSG_SEM_VALID )
return EINVAL;
return msgctl(msg->fd, IPC_RMID, NULL);
}
#endif // MSG_SEM_HPP
#include"msg_sem.hpp"
//同样,本函数也不是线程安全的。
int msg_sem_init(msg_sem_t* msg, int num)
{
int status;
if( msg == NULL || num < 0)
return EINVAL;
status = msgget(IPC_PRIVATE, 0600 | IPC_CREAT );
if( status == -1 )
return errno;
msg->fd = status;
while( num-- )
{
status = msgsnd(msg->fd, "v", 1, 0);