mqopen mq_receive mq_close和sem_open sem_wait sem_post联合使用
#include <stdio.h>
#include <semaphore.h>
#include <mqueue.h>
#include <unistd.h>
#include <string.h>
#include "pthread.h"
#include <stdlib.h>
#include <time.h>
#include <semaphore.h>
#include <sys/mman.h>
#include <sys/time.h>
#define NAME_LEN 128
#define QUEUE_NAME_PREFIX "/test__queue"
#define MAX_MSG 10
#define LONG_NAME_LEN (50)
#define TRUE 1
#define FALSE 0
#define RET_SUCCESS 0
#define RET_FAILURE -1
#define SEM_MUTEX_NAME_PREFIX "/sem-mutex"
char queue_name[NAME_LEN];
mqd_t mq;
sem_t *mutex_sem=NULL;
int sync_queue_table()
{
char *p=NULL;
char buffer[LONG_NAME_LEN];
mqd_t mq1;
mq1 = mq_open(queue_name,O_RDONLY);
if(mq1 == (mqd_t)-1)
return -1;
p=buffer;
while(1)
{
int ret = mq_receive(mq1, p, LONG_NAME_LEN, NULL);
printf("rete = %d receive = %s getpid = %d\n",ret,p,getpid());
printf("ready to sem_wait\n");
if (sem_wait(mutex_sem) == -1)
{
fprintf(stderr,"wait mutex fail\n");
return;
}
else
{
sleep(10);
printf("mutex_sem wait is success getpid = %d\n",getpid());
}
if (sem_post(mutex_sem) == -1)
{
fprintf(stderr,"leave mutex fail\n");
}
sleep(3);
}
mq_close(mq1);
return 1;
}
pid_t fork_children(int num)
{
int i;
pid_t pid;
for (i = 1; i <= num; i++)
{
pid = fork();
if (pid == -1)
return pid;
if (pid == 0)
return pid;
}
return TRUE;
}
int main ()
{
pid_t pid = 0;
struct mq_attr attr;
mode_t mode = S_IRUSR | S_IWUSR;
attr.mq_flags = 0;
attr.mq_maxmsg = MAX_MSG;
attr.mq_msgsize = LONG_NAME_LEN;
attr.mq_curmsgs = 0;
snprintf(queue_name,NAME_LEN,"%s_%ld",QUEUE_NAME_PREFIX,(long)time(NULL));
mq = mq_open(queue_name, O_CREAT | O_WRONLY , mode, &attr);
if(mq == (mqd_t)-1)
{
fprintf(stderr,"table queue initilization fail\n");
return RET_SUCCESS;
}
char sem_mutex_name[NAME_LEN];
snprintf(sem_mutex_name,NAME_LEN,"%s_%ld",SEM_MUTEX_NAME_PREFIX,(long)time(NULL));
mutex_sem = sem_open(sem_mutex_name,O_CREAT,mode,1);
if(mutex_sem==(sem_t *)-1)
{
fprintf(stderr,"create mutex fail\n");
return RET_SUCCESS;
}
pid = fork_children(5);
if(pid == -1)
{
printf("fork process is failed\n");
}
else if (pid == 0)
{
sync_queue_table();
}
else
{
int i = 0;
while(1)
{
char str[128]="";
sprintf(str,"%s%d","aaaaaaa",i++);
mq_send(mq,str,LONG_NAME_LEN,0);
sleep(1);
}
}
return 0;
}
编译命令
gcc -lrt -pthread test.c
执行结果
