zoukankan      html  css  js  c++  java
  • 进程间通信之消息队列

    消息队列是类似于管道,又类似于共享内存的进程间通信的方式.该方式使用的是采用链式存储的方式来存储消息的,而且读取过了以后该消息会被删除.而且消息会被编号,可以发送和读取不同编号的消息,方便传递不通的消息.而创建的过程和共享内存类似,但是不用进行映射,直接将获取的Id使用即可.

    #include <sys/ipc.h>
    #include <sys/msg.h>
    int msgget(key_t key, int msgflg);//创建消息队列
    返回值为消息队列的Id
     
    #include <sys/types.h>
    #include <sys/ipc.h>
    #include <sys/msg.h>
    int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);//发送消息,成功返回0,失败返回-1
    ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);//接收消息,成功返回接受的字节数,失败返回-1
    参数:第一个均为Id,使用相同key可以生成相同的id
    msgp:结构体,通常的形式为
    struct msgp {
    long mtype; // 消息类型,必须 > 0,用于区别不同类型的消息
    char mtext[16]; // 消息文本
    };
    msgsz:消息文本的大小
    msgflg:设置是否发送或者接受堵塞,0为堵塞,IPC_NOWAIT为非堵塞
     
    #include <sys/msg.h>
     
    int msgctl ( int msgqid, int cmd, struct msqid_ds *buf );//消息队列属性读取,设置,删除
    mesqid:消息队列的id
    cmd:
    IPC_STAT
    读取消息队列的数据结构msqid_ds,并将其存储在b u f指定的地址中
    IPC_SET
    设置消息队列的数据结构msqid_ds中的ipc_perm元素的值。这个值取自buf参数
    IPC_RMID
    从系统内核中移走消息队列
    buf:读取或者设置属性存放的对象,用作删除时为NULL
     
    写消息队列:
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/ipc.h>
    #include <sys/msg.h>
    #include <sys/types.h>
    #include <string.h>
    
    struct msgbuf {
    	long mtype; // 消息类型,必须 > 0
    	char mtext[8]; // 消息文本
    };
    
    int main(int argc,char *argv[]){
    	int key = 0;
    	int msqid = 0;
    	struct msgbuf buf;
    
    	strcpy(buf.mtext,"hello");//要发送的信息
    	buf.mtype = 1;//信息的类型
    
    	key = ftok("sig.c",0);
    
    	msqid = msgget(key,IPC_CREAT | 0666);
    	if(msqid > 0){
    		printf("message queue succeed
    ");
    	}else{
    		printf("creat failed
    ");
    		return -1;
    	}
    
    	int i = 0;
    	while(i < 6){
    		msgsnd(msqid,(void *)&buf,strlen(buf.mtext),0);
    		sleep(2);
    		i++;
    	}
    
    
    	msgctl(msqid,IPC_RMID,NULL);
    	
    	return 0;
    }
    

      读消息队列:

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/ipc.h>
    #include <sys/msg.h>
    #include <sys/types.h>
    #include <string.h>
    
    struct msgbuf {
    	long mtype; // 消息类型,必须 > 0
    	char mtext[8]; // 消息文本
    };
    
    int main(int argc,char *argv[]){
    	int key = 0;
    	int msqid = 0;
    	struct msgbuf buf;
    	
    	buf.mtype = 1;
    	strcpy(buf.mtext,"hello");
    
    	key = ftok("sig.c",0);
    
    	msqid = msgget(key,IPC_CREAT | 0666);
    	if(msqid > 0){
    		printf("message queue succeed
    ");
    	}else{
    		printf("creat failed
    ");
    		msgctl(msqid,IPC_RMID,NULL);
    		return -1;
    	}
    
    	int i = 0;
    	while(i < 6){
    		sleep(2);
    		msgrcv(msqid,(void *)&buf,strlen(buf.mtext),0,0);
    		i++;
    		printf("%s
    ",buf.mtext);
    	}
    
    
    	msgctl(msqid,IPC_RMID,NULL);
    	
    	return 0;
    }
    

      

  • 相关阅读:
    javascript高级编程笔记第五章
    关于form表单:hover没有修改表单子元素样式
    JavaScript 生成 对应的protobuf 对象
    ProtoBuf Maven 整合 用来生成对象
    NettyClient 连接 WebSocket
    Exception in thread "Thread-5" java.lang.NoSuchMethodError: io.netty.util.concurrent.SingleThreadEventExecutor异常处理
    Jsonp 使用 爬取 可直接解析页面
    OpenResty 配置SSL 同时支持http 全部转发到 https中
    Nginx(OpenResty)+Lua+Redis IP限流 10s内
    NginxUrl校验路径token+时间戳
  • 原文地址:https://www.cnblogs.com/CHYI1/p/5406295.html
Copyright © 2011-2022 走看看