1. 程式人生 > >system v訊息佇列msgsnd函式

system v訊息佇列msgsnd函式

/*msgsnd函式將一個訊息新增到訊息佇列*/
//第一個引數為訊息佇列的標示符msgid
//第二個引數為指標,只想準備傳送的訊息
//第三個為指標,指向訊息長度
//第四個為控制著當前訊息佇列滿或到達系統上限時將要發生的事情
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>

#define ERR_EXIT(m)
		do \
		{           \
			perror(m); \
			exit(EXIT_FAILURE); \
		}while(0) 
//第四個引數msgflg = IPC_NOWAIT表示佇列滿不等待,返回EAGAIN錯誤
//訊息結構體,一方面大小需小於系統限制MSGMAX,另外需以long/int長整形開始
/*訊息結構體*/
struct msgbuf{
	long mtype;//佔四個位元組
	char mtext[1];
}
/* ./msg_send 8192 2 */
//從前向後讀引數存入argv[1],argv[2].....
int main(int argc, char* argv[])
{
	if(argc != 3)
	{
		fprintf(stderr, "Usage: %s <bytes> <type>\n", argv[0]);
		exit(EXIT_FAILURE);
	}

	int len = atoi(argv[1]);//8192訊息長度
	int type = atoi(argv[2]);//讀2為訊息型別
	int msgid;

	msgid = msgget(1234, 0666 | IPC_CREAT | IPC_EXCL);
	msgid = msgget(1234, 0);//0可以開啟任何許可權的訊息佇列,只打開不建立

	if(msgid == -1)
	{
		ERR_EXIT("msgget");
	}

	printf("msgget success\n");
	
	struct msgbuf *ptr;//訊息結構體
	ptr = (struct msgbuf*)malloc(sizeof(long)+len);
	ptr->mtype = type;//mtext未設定,即傳送任意訊息
	if(msgsnd(msgid, ptr, len, 0)<0)//當訊息大於限制時,阻塞傳送
	{
		ERR_EXIT("msgsnd");
	}
	return 0;
}