linux操作系统消息队列

简介: 所谓消息队列就是指一个消息链表。int msgget(key_t, int flag):创建和打开队列int msgsnd(int msqid, struct msgbuf *msgp, size_t msgsz, int flag):发送消息,msgid是消息队列的id,msgp是消息内容所在的缓冲区,msgsz是消息的大小,msgflg是标志。
所谓消息队列就是指一个消息链表。
int msgget(key_t, int flag):创建和打开队列
int msgsnd(int msqid, struct msgbuf *msgp, size_t msgsz, int flag):发送消息,msgid是消息队列的id,msgp是消息内容所在的缓冲区,msgsz是消息的大小,msgflg是标志。

int msgrcv(int msqid, struct msgbuf *msgp, size_t msgsz, long msgtyp, int flag):接受消息,msgtyp是期望接收的消息类型。

msgqueue.c文件内容如下;

#include<sys/types.h>
#include<sys/ipc.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<pthread.h> // 增加线程支持

#define BUFSZ 512

struct message{
    long msg_type;
    char msg_text[BUFSZ];
};

#define MSG_SIZE sizeof(struct message)

char app_exit = 0;
void *thread_funtion(void *parg);

int main()
{
    int qid;
    key_t key;
    int len;
    int res;
    pthread_t a_thread;
    struct message msg;

    if((key = ftok(".",'a')) == -1){ // ftok 获得一个key
        perror("ftok");
        exit(1);
    }

    if((qid = msgget(key,IPC_CREAT|0666)) == -1){ // 创建一个消息队列
        perror("msgget");
        exit(1);
    }

    printf("opened queue %d\n",qid);
    puts("Please enter the message to queue:");
    if((fgets(msg.msg_text,BUFSZ,stdin)) == NULL){ // 从标准输入获得buffer
        puts("no message");
        exit(1);
    }
    
    msg.msg_type = getpid();
    len = strlen(msg.msg_text) + sizeof(msg.msg_type);
    if((msgsnd(qid,&msg,len,0)) < 0){ // 发送消息
        perror("message posted");
        exit(1);
    }

    /*
    memset(&msg,0,sizeof(msg)); // 清除内存为0

    if(msgrcv(qid,&msg,len,0) < 0){ // 接收消息
        perror("message recv");
        exit(1);
    }

    printf("message is:%s\n",(&msg)->msg_text);
    if((msgctl(qid,IPC_RMID,NULL))<0){
        perror("msgctl");
        exit(1);
    }
	*/
    res = pthread_create(&a_thread,NULL,thread_funtion,(void *)&qid);
    
    printf("The msgrcv thread is create sucess!\n");

	while((app_exit =  getchar()) != 'e'){sleep(50);}
    
    printf("exit main funtion!\n");
    exit(0);
}

void *thread_funtion(void *parg)
{
    struct message msg;
    int qid;
    
    qid = *((int *)parg);
    memset(&msg,0,MSG_SIZE);
    while(app_exit != 'e'){
        if(msgrcv(qid,&msg,MSG_SIZE) < 0){
            sleep(50);
            continue;
        }
        printf("message is:%s\n",(&msg)->msg_text);
        if(msgctl(qid,IPC_RMID,NULL) < 0){
            perror("msgctl");
        }
        sleep(50);
    }
}

Makefile文件类型如下;

all:msgqueue

# which compiler
CC = gcc

# Where are include file kept
INCLUDE = .

# Where to install
INSTDIR = /usr/local/bin

# Options for development
CFLAGS = -g -Wall -ansi

msgqueue:msgqueue.o
	$(CC) -D_REENTRANT -o msgqueue msgqueue.o -lpthread

msgqueue.o:msgqueue.c
#	$(CC) -I$(INCLUDE) $(CFLAGS) -c msgqueue.c
#	$(CC) -D_REENTRANT -c msgqueue.c -lpthread
	$(CC) -c msgqueue.c

clean:
	-rm msgqueue.o msgqueue

install:msgqueue
	@if [-d $(INSTDIR) ];\
        then \
        cp msgqueue $(INSTDIR);\
        chmod a+x $(INSTDIR)/msgqueue;\
        chmod og-w $(INSTDIR)/msgqueue;\
        echo "Install in $(INSTDIR)";\
    else \
       echo "Sorry,$(INSTDIR) does not exist";\
    fi 


目录
相关文章
|
1月前
|
监控 Unix Linux
Linux操作系统调优相关工具(四)查看Network运行状态 和系统整体运行状态
Linux操作系统调优相关工具(四)查看Network运行状态 和系统整体运行状态
34 0
|
1月前
|
Linux
Linux操作系统调优相关工具(三)查看IO运行状态相关工具 查看哪个磁盘或分区最繁忙?
Linux操作系统调优相关工具(三)查看IO运行状态相关工具 查看哪个磁盘或分区最繁忙?
26 0
|
1月前
|
存储 Linux
linux查看系统版本、内核信息、操作系统类型版本
linux查看系统版本、内核信息、操作系统类型版本
62 9
|
23小时前
|
存储 Shell Linux
操作系统实战(一)(linux+C语言)
本篇文章重点在于利用linux系统的完成操作系统的实验,巩固课堂知识
|
1天前
|
Linux Shell
Linux操作系统下查找大文件或目录的技巧
Linux操作系统下查找大文件或目录的技巧
|
1天前
|
算法 Ubuntu Linux
为什么Linux不是实时操作系统
本文探讨了Linux为何不是实时操作系统(RTOS)。实时性关乎系统对事件的确定性响应时间,而Linux虽能保证调度执行的实时任务,但无法确保中断响应时间、中断处理时间和任务调度时间的确定性。中断响应时间受中断屏蔽时间影响,Linux中无法确保;中断处理时间因不支持中断嵌套而不确定;任务调度时间虽快,但调度点的限制影响实时性。Linux的定位是通用操作系统,追求平均性能而非绝对实时性。为改善实时性,Linux提供了不同抢占模型,如可抢占内核(Low-Latency Desktop)和PREEMPT-RT补丁,后者接近硬实时但牺牲了吞吐量。PREEMPT-RT正逐渐成为Linux实时增强的标准。
8 1
为什么Linux不是实时操作系统
|
1天前
|
存储 Ubuntu Linux
xenomai3+linux构建linux实时操作系统-基于X86_64和arm
Xenomai是一个实时性解决方案,通过在Linux上添加实时内核Cobalt来增强实时性能。它有三个主要部分:libcobalt(用户空间实时库)、Cobalt(内核空间实时内核)和硬件架构特定层(ipipe-core或dovetail)。ipipe-core适用于Linux 5.4以下版本,而dovetail用于5.4及以上版本。本文介绍了在X86 Ubuntu环境下,如何编译Xenomai内核,搭建应用环境,包括配置、编译、安装和实时性测试。对于其他硬件架构,如ARM和ARM64,步骤类似。文章还提到了Xenomai与Linux内核版本的兼容性和实时性测试结果。
11 0
xenomai3+linux构建linux实时操作系统-基于X86_64和arm
|
1天前
|
消息中间件 测试技术 Linux
linux实时操作系统xenomai x86平台基准测试(benchmark)
本文是关于Xenomai实时操作系统的基准测试,旨在评估其在低端x86平台上的性能。测试模仿了VxWorks的方法,关注CPU结构、指令集等因素对系统服务耗时的影响。测试项目包括信号量、互斥量、消息队列、任务切换等,通过比较操作前后的时戳来测量耗时,并排除中断和上下文切换的干扰。测试结果显示了各项操作的最小、平均和最大耗时,为程序优化提供参考。注意,所有数据基于特定硬件环境,测试用例使用Alchemy API编写。
8 0
linux实时操作系统xenomai x86平台基准测试(benchmark)
|
1天前
|
存储 Linux C语言
Linux:冯·诺依曼结构 & OS管理机制
Linux:冯·诺依曼结构 & OS管理机制
8 0
|
12天前
|
存储 Oracle 关系型数据库
linux操作系统相关资源优化
【4月更文挑战第21天】基于操作系统的性能优化也是多方面的,主要是系统安装、系统内核参数、网络参数、文件系统等几个方面进行衡量
23 2