• linux第10天 msg消息队列


    cat /proc/sys/kernel/msgmax最大消息长度限制

    cat /proc/sys/kernel/msgmnb消息队列总的字节数

    cat /proc/sys/kernel/msgmni消息条目数

    消息队列综合案例

    //server
    
    
    
    
    
    #include <sys/types.h>
    #include <sys/ipc.h>
    #include <sys/msg.h>
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <unistd.h>
    
    #define ERR_EXIT(m) 
    	do 
    	{ 
    		perror(m); 
    	} 
    	while(0);
    
    
    struct msgbuf {
       long mtype;       /* message type, must be > 0 */
       char mtext[1024];    /* message data */
    };
    
    
    int main()
    {
    	struct msgbuf revbuf;
    	int key 	= 0;
    	int msgid   = 0;
    	int ret 	= 0;
    	int pid		= 0;
    	
    	key = ftok("./", '2');
    	if (key < 0)
    		ERR_EXIT("ftok");
    	
    	//获取消息队列	
    	ret = msgget(key, 0666 | IPC_CREAT | IPC_EXCL);
    	if (ret < 0)
    	{
    		if (errno == EEXIST) //如果消息队列已存在
    			msgid = msgget(key, 0666);
    		else 
    			ERR_EXIT("msgget:");
    	}
    	else 
    		msgid = ret;
    		
    	//设置发送buf
    	memset(&revbuf, 0, sizeof(revbuf));
    	
    	revbuf.mtype = 1; //接收方总是接收类型1
    	while (1)
    	{
    		ret = msgrcv(msgid, &revbuf, sizeof(revbuf.mtext), 1, 0);
    		if (ret < 0)
    			ERR_EXIT("msgrcv:");
    			
    		fputs(revbuf.mtext + 4, stdout);
    			
    		pid = *((int *)(revbuf.mtext));
    		
    		revbuf.mtype = pid;
    		ret = msgsnd(msgid, &revbuf, ret, IPC_NOWAIT);
    		if (ret < 0)
    			ERR_EXIT("msgsnd");
    	}
    		
    	return 0;
    }
    

      

    //clt
    
    
    
    
    
    #include <sys/types.h>
    #include <sys/ipc.h>
    #include <sys/msg.h>
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <unistd.h>
    
    #define ERR_EXIT(m) 
    	do 
    	{ 
    		perror(m); 
    	} 
    	while(0);
    
    
    struct msgbuf {
       long mtype;       /* message type, must be > 0 */
       char mtext[1024];    /* message data */
    };
    
    
    int main()
    {
    	struct msgbuf sndbuf;
    	struct msgbuf revbuf;
    	int key 	= 0;
    	int msgid   = 0;
    	int ret 	= 0;
    	int pid		= 0;
    	
    	key = ftok("./", '2');
    	if (key < 0)
    		ERR_EXIT("ftok");
    		
    	//获取消息队列
    	ret = msgget(key, 0666 | IPC_CREAT | IPC_EXCL);
    	if (ret < 0)
    	{
    		if (errno == EEXIST) //如果消息队列已存在
    			msgid = msgget(key, 0666);
    		else 
    			ERR_EXIT("msgget:");
    	}
    	else 
    		msgid = ret;
    		
    	//设置发送buf
    	memset(&sndbuf, 0, sizeof(sndbuf));
    	memset(&revbuf, 0, sizeof(revbuf));
    
    	pid = getpid(); //获取pid作为包头发出去
    
    	while (fgets(sndbuf.mtext + 4, sizeof(sndbuf.mtext), stdin) != NULL)
    	{
    		sndbuf.mtype = 1; //发送方总是发送类型1
    		
    		memcpy(sndbuf.mtext, &pid, 4);
    		//*((int*)sndbuf.mtext) = pid; //这句话是指将sndbuf.mtext最前面四个字节指向一个int类型指针
    		
    		ret = msgsnd(msgid, &sndbuf, strlen(sndbuf.mtext + 4) + 4, IPC_NOWAIT);
    		if (ret < 0)
    			ERR_EXIT("msgsnd");
    			
    		sleep(1);
    		//读取
    		ret = msgrcv(msgid, &revbuf, sizeof(revbuf.mtext), pid, IPC_NOWAIT);
    		if (ret < 0)
    			ERR_EXIT("msgrcv:");
    			
    		fputs(revbuf.mtext + 4, stdout);
    		
    		memset(&sndbuf, 0, sizeof(sndbuf));
    		memset(&revbuf, 0, sizeof(revbuf));		
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    如何在android studio 1.0 启动时设置代理【解决WARN
    【转】如何阅读android源码
    【Android】 BroadcastReceiver详解
    如何在Android app中支持多主题
    从源码角度剖析 setContentView() 背后的机制
    【转】Android EditText的使用及值得注意的地方
    【转】Android应用程序打包时,出现错误:"XXX" is not translated in "af" (Afrikaans), "am" (Amharic), "ar" (Arabic).....
    【转】Fragment对用户可见的判断实践,亲测有效
    【转】从java1到java9每个版本都有什么新特性?
    【转】贝塞尔曲线介绍
  • 原文地址:https://www.cnblogs.com/c-slmax/p/5263891.html
Copyright © 2020-2023  润新知