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\n", key);
	}
	
	if ((msg_id = msgget(key, 0666 | IPC_CREAT)) == -1)
	{
		perror("msgget");
		exit(-1);
	}
	else 
	{
		printf("msg_id = %d\n", 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\n", argv[0]);
		return 0;
	}
	
	printf("path : %s, id = %x\n", argv[1], atoi(argv[2]));
	msgid = Creat_msg(argv[1], atoi(argv[2]));
	printf("msgid = %d\n", msgid);
	
	buf1.type = 0x32;
#if 1
	while(1)
	{
		ret = msgsnd(msgid, (void *)&buf1, 256, 0); //最後一個參數IPC_NOWAIT可以設置非阻塞
		//perror("msgrecv");
		printf("ret = %d, errno = %d\n", ret, errno);
		if(ret  < 0 )
		{
			printf("get ENOMSG\n");
			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\n", key);
	}
	
	if ((msg_id = msgget(key, 0666 | IPC_CREAT)) == -1)
	{
		perror("msgget");
		exit(-1);
	}
	else 
	{
		printf("msg_id = %d\n", 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\n", argv[0]);
		return 0;
	}
	printf("path : %s, id = %x\n", argv[1], atoi(argv[2]));
	msgid = Creat_msg(argv[1], atoi(argv[2]));
	printf("msgid = %d\n", msgid);
	
	
#if 1
	while(1)
	{
		ret = msgrcv(msgid, (void *)&buf1, 256, 0x32, 0); //最後一個參數使用IPC_NOWAIT可以設置非阻塞
		//perror("msgrecv");
		printf("ret = %d, errno = %d\n", ret, errno);
		if(ret  < 0 )
		{
			printf("get ENOMSG\n");
			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

 

微信公衆號:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章