1. 程式人生 > >程序間的通訊(八)

程序間的通訊(八)

編寫程式完成以下要求:

1.程序A向訊息佇列傳送訊息“hello world” 
2.程序B從訊息佇列讀取訊息,並列印
3.程序C向訊息佇列傳送"自己的姓名"
4.程序D從訊息佇列中取出姓名字串,並列印
 

訊息佇列也叫報文佇列,是一個訊息的連結串列。可以把訊息看作是一個記錄,具有特定的格式以及優先順序。對訊息佇列具有寫許可權的程序可以按照一定的規則向訊息佇列中新增訊息,而對訊息佇列具有寫許可權的程序可以從訊息佇列中讀走訊息。和管道相似的是,訊息一旦從訊息佇列中被讀走,則訊息佇列中便不在存在此條訊息。

IPC訊息佇列的預設最大數為16;

每個訊息預設最大值為8192位元組;

佇列中的最大值預設為16384位元組;

 

每個訊息佇列都有其對應的屬性資訊,儲存在struct_msqid_ds結構體中。

每個訊息佇列都有一個對應的id,標識訊息佇列的唯一性。

程式如下:

#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <unistd.h>
#include <sys/msg.h>
#include <sys/types.h>
struct msg{
	char msg_str[128];
};

int main()
{
	int qid;
	struct msg mymsg;
	if(qid = msgget(0x66,0666|IPC_CREAT) < 0)
	  perror("msgget");

	int pid;
	pid = fork();
	if(pid < 0)
	  perror("fork");
	else if(pid == 0)
	{
		printf("This is A process!\n");
		sprintf(mymsg.msg_str,"hello world");
		
		if(msgsnd(qid,&mymsg,128,0) < 0)
		  perror("msgsnd");
	}
	else
	{
		if(fork() == 0)
		{
			printf("This is B process!\n");
			if(msgrcv(qid,&mymsg,128,0,0) < 0)
			  perror("msgrcv");

			printf("The msg is: %s\n",mymsg.msg_str);
		}
		else if(fork() == 0)
		{
			printf("This is the C process!\n");
			sprintf(mymsg.msg_str,"wangguagnjie");

			if(msgsnd(qid,&mymsg,128,0) < 0)
			  perror("msgsnd");
		}
		else
		{
			printf("This is D process!\n");
			if(msgrcv(qid,&mymsg,128,0,0) < 0)
			  perror("msgrcv");

			printf("The msg is: %s\n",mymsg.msg_str);
		}
	}
	return 0;
}

該程式利用fork函式建立了四個程序,分別完成傳送和接受的任務。

程式執行結果如下: