zoukankan      html  css  js  c++  java
  • 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;
    }
    

      

  • 相关阅读:
    bzoj 3930: [CQOI2015]选数
    bzoj 2301: [HAOI2011]Problem b
    HDU 1695 GCD
    2017ACM/ICPC广西邀请赛-重现赛 1007.Duizi and Shunzi
    2017ACM/ICPC广西邀请赛-重现赛 1010.Query on A Tree
    2017ACM/ICPC广西邀请赛-重现赛 1004.Covering
    P3501 [POI2010]ANT-Antisymmetry
    P1171 售货员的难题
    P3385 【模板】负环
    P1659 [国家集训队]拉拉队排练
  • 原文地址:https://www.cnblogs.com/c-slmax/p/5263891.html
Copyright © 2011-2022 走看看