zoukankan      html  css  js  c++  java
  • Linux系统之《消息队列》入手应用

     

    目录

     

    简述

    代码

    编译

    运行


    简述

    消息队列是Linux进程间通信方式之一,消息队列一般是用于简单的通信,数据量不大,通信不频繁的情况。如果交互频繁或者数据量大就不适合了。

    代码

    下面直接上代码,发送端代码:

    //file name: msg_test.c
    
    #include "msg_test.h"
    
    //创建消息队列
    int Creat_msg(char *path, int id)
    {
    	key_t key;
    	int msg_id;
    	puts(path);
    	if ((key = ftok(path, id)) == -1)
    	{
    		perror("ftok");
    		exit(-1);
    	}
    	else 
    	{
    		printf("key = %d
    ", key);
    	}
    	
    	if ((msg_id = msgget(key, 0666 | IPC_CREAT)) == -1)
    	{
    		perror("msgget");
    		exit(-1);
    	}
    	else 
    	{
    		printf("msg_id = %d
    ", msg_id);
    	}	
    	return msg_id;
    }
    struct msg 
    {
    	long type;
    	char buf[256+1];
    };
    int 
    main(int argc, char **argv)
    {
    	int msgid = 0;
    	int ret = 0;
    	struct msg_struct msg_buf;
    	struct msg buf1;
    	bzero(&msg_buf, sizeof(msg_buf));
    	
    	if(argc != 3)
    	{
    		printf("Usag: ./%s path id
    ", argv[0]);
    		return 0;
    	}
    	
    	printf("path : %s, id = %x
    ", argv[1], atoi(argv[2]));
    	msgid = Creat_msg(argv[1], atoi(argv[2]));
    	printf("msgid = %d
    ", msgid);
    	
    	buf1.type = 0x32;
    #if 1
    	while(1)
    	{
    		ret = msgsnd(msgid, (void *)&buf1, 256, 0); //最后一个参数IPC_NOWAIT可以设置非阻塞
    		//perror("msgrecv");
    		printf("ret = %d, errno = %d
    ", ret, errno);
    		if(ret  < 0 )
    		{
    			printf("get ENOMSG
    ");
    			return 0;
    		}
    		usleep(2000);
    	}
    #endif	
    	if(msgctl(msgid, IPC_RMID, NULL)< 0)
    	{
    		perror("");
    	}
    	else 
    	printf("rm OK!");
    	return 0;
    }
    
    

    接收端代码:

    //file name: msg_test.c
    
    #include "msg_test.h"
    
    //创建消息队列
    int Creat_msg(char *path, int id)
    {
    	key_t key;
    	int msg_id;
    	puts(path);
    	if ((key = ftok(path, id)) == -1)
    	{
    		perror("ftok");
    		exit(-1);
    	}
    	else 
    	{
    		printf("key = %d
    ", key);
    	}
    	
    	if ((msg_id = msgget(key, 0666 | IPC_CREAT)) == -1)
    	{
    		perror("msgget");
    		exit(-1);
    	}
    	else 
    	{
    		printf("msg_id = %d
    ", msg_id);
    	}	
    	return msg_id;
    }
    struct msg 
    {
    	long type;
    	char buf[256+1];
    };
    int 
    main(int argc, char **argv)
    {
    	int msgid = 0;
    	int ret = 0;
    	struct msg_struct msg_buf;
    	struct msg buf1;
    	bzero(&msg_buf, sizeof(msg_buf));
    	
    	if(argc != 3)
    	{
    		printf("Usag: ./%s path id
    ", argv[0]);
    		return 0;
    	}
    	printf("path : %s, id = %x
    ", argv[1], atoi(argv[2]));
    	msgid = Creat_msg(argv[1], atoi(argv[2]));
    	printf("msgid = %d
    ", msgid);
    	
    	
    #if 1
    	while(1)
    	{
    		ret = msgrcv(msgid, (void *)&buf1, 256, 0x32, 0); //最后一个参数使用IPC_NOWAIT可以设置非阻塞
    		//perror("msgrecv");
    		printf("ret = %d, errno = %d
    ", ret, errno);
    		if(ret  < 0 )
    		{
    			printf("get ENOMSG
    ");
    			return 0;
    		}		
    	}
    #endif	
    	if(msgctl(msgid, IPC_RMID, NULL)< 0)
    	{
    		perror("");
    	}
    	else 
    	printf("rm OK!");
    	return 0;
    }
    
    

    编译

    gcc msg_send.c  -o msg_send
    gcc msg_test.c  -o msg_recv

    运行

    接收端:
    ./msg_recv  /tmp/ 1
    path : /tmp/, id = 1
    /tmp/
    key = 16842896
    msg_id = 16252928
    msgid = 16252928
    ret = 256, errno = 0   //接收到数据
    ret = 256, errno = 0
    
    发送端:
    ./msg_send  /tmp/ 1
    path : /tmp/, id = 1
    /tmp/
    key = 16842896
    msg_id = 16252928
    msgid = 16252928
    ret = 0, errno = 0     //发送成功
    ret = 0, errno = 0
    
  • 相关阅读:
    java-抽象类
    java-接口
    java-面向对象总结
    java-单例设计模式
    java数组
    .Net框架整理
    PHP结合memcacheq消息队列解决并发问题
    浅谈DDos攻击
    PHP+ffmpeg+nginx的配置实现视频转码(转)
    使用Nginx的X-Accel-Redirect实现大文件下载
  • 原文地址:https://www.cnblogs.com/fensnote/p/13436453.html
Copyright © 2011-2022 走看看