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天前
|
监控 Linux 云计算
Linux操作系统在云计算环境中的实践与优化###
【10月更文挑战第16天】 本文探讨了Linux操作系统在云计算环境中的应用实践,重点分析了其在稳定性、安全性和高效性方面的优势。通过具体案例,阐述了Linux如何支持虚拟化技术、实现资源高效分配以及与其他开源技术的无缝集成。文章还提供了针对Linux系统在云计算中的优化建议,包括内核参数调整、文件系统选择和性能监控工具的应用,旨在帮助读者更好地理解和应用Linux于云计算场景。 ###
8 3
|
8天前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
【10月更文挑战第9天】本文将深入浅出地介绍Linux系统中的进程管理机制,包括进程的概念、状态、调度以及如何在Linux环境下进行进程控制。我们将通过直观的语言和生动的比喻,让读者轻松掌握这一核心概念。文章不仅适合初学者构建基础,也能帮助有经验的用户加深对进程管理的理解。
12 1
|
19天前
|
安全 Linux
探索Linux操作系统的启动过程
在这篇文章中,我们将深入探讨Linux系统的启动流程,从电源开启到登录界面呈现的每一个步骤。我们将揭示BIOS、引导加载器、内核以及初始化进程如何协同工作,使Linux系统顺利启动。通过了解这些过程,读者将能更好地理解Linux系统的工作原理,并为可能出现的启动问题提供解决思路。
56 14
|
10天前
|
Unix 物联网 大数据
操作系统的演化与比较:从Unix到Linux
本文将探讨操作系统的历史发展,重点关注Unix和Linux两个主要的操作系统分支。通过分析它们的起源、设计哲学、技术特点以及在现代计算中的影响,我们可以更好地理解操作系统在计算机科学中的核心地位及其未来发展趋势。
|
22天前
|
Linux 数据安全/隐私保护
探索Linux操作系统下的权限管理
【8月更文挑战第66天】在数字世界中,操作系统的权限管理就如同现实世界中的钥匙和锁,保护着我们的数据安全。本文将带你深入理解Linux系统中的权限设置,通过实际代码示例,让你掌握文件和目录权限的分配与管理技巧。准备好了吗?让我们开始这场关于权限管理的探险之旅吧!
76 14
|
17天前
|
Ubuntu Java Linux
Linux操作系统——概念扫盲I
Linux操作系统——概念扫盲I
33 4
|
27天前
|
安全 Linux 数据安全/隐私保护
探索Linux操作系统的文件权限管理
【9月更文挑战第29天】在数字世界中,文件权限管理如同保护我们隐私的锁。本文将带你了解如何在Linux系统中设置和管理文件权限,确保你的数据安全。我们将一起学习如何通过命令行工具来控制文件访问,就像学习一门新语言一样有趣。准备好了吗?让我们一起开启这场技术之旅!
|
18天前
|
存储 Linux
服务器数据恢复—Linux操作系统网站服务器数据恢复案例
服务器数据恢复环境: 一台linux操作系统网站服务器,该服务器上部署了几十个网站,使用一块SATA硬盘。 服务器故障&原因: 服务器在工作过程中突然宕机。管理员尝试重新启动服务器失败,于是将服务器上的硬盘拆下检测,发现很多坏扇区。联系当地的一家数据恢复公司处理,但是没有成功。
|
1月前
|
存储 安全 Linux
探索Linux操作系统的心脏:内核
在这篇文章中,我们将深入探讨Linux操作系统的核心—内核。通过简单易懂的语言和比喻,我们会发现内核是如何像心脏一样为系统提供动力,处理数据,并保持一切顺畅运行。从文件系统的管理到进程调度,再到设备驱动,我们将一探究竟,看看内核是怎样支撑起整个操作系统的大厦。无论你是计算机新手还是资深用户,这篇文章都将带你领略Linux内核的魅力,让你对这台复杂机器的内部运作有一个清晰的认识。
68 3
|
1月前
|
存储 数据挖掘 Linux
服务器数据恢复—Linux操作系统网站服务器数据恢复案例
服务器数据恢复环境: 一台linux操作系统服务器上跑了几十个网站,服务器上只有一块SATA硬盘。 服务器故障: 服务器突然宕机,尝试再次启动失败。将硬盘拆下检测,发现存在坏扇区