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 


目录
相关文章
|
4天前
|
运维 自然语言处理 Ubuntu
OS Copilot-操作系统智能助手-Linux新手小白的福音
OS Copilot 是阿里云推出的一款操作系统智能助手,专为Linux新手设计,支持自然语言问答、辅助命令执行和系统运维调优等功能。通过简单的命令行操作,用户可以快速获取所需信息并执行任务,极大提升了Linux系统的使用效率。安装步骤简单,只需在阿里云服务器上运行几条命令即可完成部署。使用过程中,OS Copilot不仅能帮助查找命令,还能处理文件和复杂场景,显著节省了查找资料的时间。体验中发现,部分输出格式和偶尔出现的英文提示有待优化,但整体非常实用,特别适合Linux初学者。
44 10
|
4天前
|
Linux
Linux 操作系统
在 Linux 中,UID(用户 ID)是标识用户身份的重要概念。UID 唯一标识每个用户,通过 UID 可区分不同用户类别:UID 0 为超级用户,1-999 为系统用户,1000 及以上为普通用户。因此,正确选项为:UID 标识用户、可区分用户类别、普通用户 UID 大于 1000。
|
2月前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
本文旨在探讨Linux操作系统中的进程管理机制,包括进程的创建、执行、调度和终止等环节。通过对Linux内核中相关模块的分析,揭示其高效的进程管理策略,为开发者提供优化程序性能和资源利用率的参考。
109 1
|
10天前
|
消息中间件 Linux
Linux中的System V通信标准--共享内存、消息队列以及信号量
希望本文能帮助您更好地理解和应用System V IPC机制,构建高效的Linux应用程序。
79 48
|
1月前
|
缓存 安全 Linux
Linux系统查看操作系统版本信息、CPU信息、模块信息
在Linux系统中,常用命令可帮助用户查看操作系统版本、CPU信息和模块信息
109 23
|
1月前
|
弹性计算 自然语言处理 Ubuntu
OS Copilot-操作系统智能助手-Linux新手小白的福音
OS Copilot是由阿里云推出的操作系统智能助手,专为Linux新手设计,支持自然语言问答、辅助命令执行等功能,极大提升了Linux系统的使用效率。用户只需通过简单的命令或自然语言描述问题,OS Copilot即可快速提供解决方案并执行相应操作。例如,查询磁盘使用量等常见任务变得轻松快捷。此外,它还支持从文件读取复杂任务定义,进一步简化了操作流程。虽然在某些模式下可能存在小问题,但总体上大大节省了学习和操作时间,提高了工作效率。
131 2
OS Copilot-操作系统智能助手-Linux新手小白的福音
|
1月前
|
消息中间件 Linux
Linux:进程间通信(共享内存详细讲解以及小项目使用和相关指令、消息队列、信号量)
通过上述讲解和代码示例,您可以理解和实现Linux系统中的进程间通信机制,包括共享内存、消息队列和信号量。这些机制在实际开发中非常重要,能够提高系统的并发处理能力和数据通信效率。希望本文能为您的学习和开发提供实用的指导和帮助。
117 20
|
30天前
|
弹性计算 运维 Ubuntu
os-copilot在Alibaba Cloud Linux镜像下的安装与功能测试
我顺利使用了OS Copilot的 -t -f 功能,我的疑惑是在换行的时候就直接进行提问了,每次只能写一个问题,没法连续换行更有逻辑的输入问题。 我认为 -t 管道 功能有用 ,能解决环境问题的连续性操作。 我认为 -f 管道 功能有用 ,可以单独创建可连续性提问的task问题。 我认为 | 对文件直接理解在新的服务器理解有很大的帮助。 此外,我还有建议 可以在非 co 的环境下也能进行连续性的提问。
70 7
|
1月前
|
存储 运维 安全
深入解析操作系统控制台:阿里云Alibaba Cloud Linux(Alinux)的运维利器
本文将详细介绍阿里云的Alibaba Cloud Linux操作系统控制台的功能和优势。
66 5
|
1月前
|
安全 大数据 Linux
云上体验最佳的服务器操作系统 - Alibaba Cloud Linux | 飞天技术沙龙-CentOS 迁移替换专场
本次方案的主题是云上体验最佳的服务器操作系统 - Alibaba Cloud Linux ,从 Alibaba Cloud Linux 的产生背景、产品优势以及云上用户使用它享受的技术红利等方面详细进行了介绍。同时,通过国内某社交平台、某快递企业、某手机客户大数据业务 3 大案例,成功助力客户实现弹性扩容能力提升、性能提升、降本增效。 1. 背景介绍 2. 产品介绍 3. 案例分享

热门文章

最新文章