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 


目录
相关文章
|
9月前
|
Ubuntu 物联网 Linux
从零安装一个Linux操作系统几种方法,以Ubuntu18.04为例
一切就绪后,我们就可以安装操作系统了。当系统通过优盘引导起来之后,我们就可以看到跟虚拟机中一样的安装向导了。之后,大家按照虚拟机中的顺序安装即可。 好了,今天主要介绍了Ubuntu Server版操作系统的安装过程,关于如何使用该操作系统,及操作系统更深层的原理,还请关注本号及相关圈子。
|
存储 Linux API
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
在计算机系统的底层架构中,操作系统肩负着资源管理与任务调度的重任。当我们启动各类应用程序时,其背后复杂的运作机制便悄然展开。程序,作为静态的指令集合,如何在系统中实现动态执行?本文带你一探究竟!
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
|
存储 Linux iOS开发
【Linux】冯诺依曼体系与操作系统理解
本文深入浅出地讲解了计算机体系的两大核心概念:冯诺依曼体系结构与操作系统。冯诺依曼体系作为现代计算机的基础架构,通过中央处理器、存储器和输入输出设备协同工作,解决了硬件性能瓶颈问题。操作系统则是连接硬件与用户的桥梁,管理软硬件资源,提供运行环境。文章还详细解析了操作系统的分类、意义及管理方式,并重点阐述了系统调用的作用,为学习Linux系统编程打下坚实基础。适合希望深入了解计算机原理和技术内幕的读者。
355 1
|
9月前
|
Ubuntu Unix Linux
操作系统的最强入门科普(Unix/Linux篇)
下期文章,小枣君会重点聊聊Windows和macOS那条线。敬请关注! 如果大家觉得文章不错,还请帮忙多多转发!谢谢!
|
9月前
|
监控 Ubuntu Linux
什么Linux,Linux内核及Linux操作系统
上面只是简单的介绍了一下Linux操作系统的几个核心组件,其实Linux的整体架构要复杂的多。单纯从Linux内核的角度,它要管理CPU、内存、网卡、硬盘和输入输出等设备,因此内核本身分为进程调度,内存管理,虚拟文件系统,网络接口等4个核心子系统。
969 0
|
9月前
|
Unix 物联网 Linux
都什么年代了,你还不懂啥是Linux操作系统
至于华为鸿蒙操作系统是不是独树一帜,这个留给各位阅读本文的网友们来讨论
460 0
|
9月前
|
Web App开发 缓存 Rust
|
9月前
|
安全 Linux iOS开发
linux属于什么操作系统
Linux是一种自由和开放源代码的操作系统,具有高度的灵活性和可定制性。与常见的操作系统如Windows和macOS相比,Linux具有自由、安全和稳定等优势。Linux已广泛应用于服务器、桌面电脑、超级计算机和嵌入式设备等领域,并且在未来的发展前景广阔。由于其自由和开放源代码的特性,Linux还促进了计算机技术和社区的发展,为全球的计算机用户提供了更多的选择和可能性。
|
9月前
|
安全 Ubuntu Unix
关于Linux操作系统,你必须要知道的事
我们可以看到无论是Debian还是Buildroot都有各自的特点,为客户提供了更大的选择空间和灵活性,大家可以根据自己的需求选择合适的版本来满足终端用户的体验和功能需求。从平技术将会一直关注更多更安全、灵敏、易于开发的Linux版本,做好适配工作,不断为客户带来“简单开发、方便应用”的使用体验。
|
9月前
|
安全 Ubuntu Linux
如何安装Linux操作系统?
此时,您可以选择重新启动计算机,然后从硬盘上的Linux系统启动。以上是一个大致的安装过程。请注意,不同的Linux发行版可能会在细节上有所差异,因此在进行安装之前,请确保您阅读并理解了相应发行版的安装指南或文档。