使用mqopen mq_receive mq_close和sem_open sem_wait sem_post给不同进程发送任务去执行

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
    attr.mq_flags = 0; //mq_getattr Flags: 0 or O_NONBLOCK
    attr.mq_maxmsg = MAX_MSG;
    attr.mq_msgsize = LONG_NAME_LEN; //cat /proc/sys/fs/mqueue/msg_max
    attr.mq_curmsgs = 0;

    snprintf(queue_name,NAME_LEN,"%s_%ld",QUEUE_NAME_PREFIX,(long)time(NULL));
    //mq_open用于打开或创建一个消息队列
    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));
	//创建一个有名信号量,初始值为1
    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;
    }
	//这里可以去掉
   /* mutex_sem = sem_open(sem_mutex_name, 0);
    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

执行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值