Linux進程間通信-消息隊列

#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define BUFSZ 512

struct message{
	long msg_type;
	char msg_text[BUFSZ];
};

int main(){
	int qid, msgsnd_fd, msgrcv_fd, msgctl_fd;
	key_t key;
	int len;
	struct message msg;
	char *ret;

	/*creat "key"*/
	key = ftok(".", 'a');
	printf("returned value of ftok() is: %d\n", key);
	if(key == -1){
		perror("ftok");
		exit(1);
	}

	/*creat message queue*/
	qid = msgget(key, IPC_CREAT|0666);
	printf("returned value of msgget() is: %d\n", qid);
	if(qid == -1){
		perror("msgget");
		exit(1);
	}
	printf("open queue\n");
	puts("Please enter the message to queue:");
	ret = fgets((&msg)->msg_text, BUFSZ, stdin);
	printf("ret = %d\n", *ret);
	if(ret == NULL){
		puts("no message");
		exit(1);
	}
	msg.msg_type = getpid();
	printf("msg.msg_type = %ld\n", msg.msg_type);
	len = strlen(msg.msg_text);
	printf("len = %d\n", len);

	/*add message to message queue*/
	msgsnd_fd = msgsnd(qid, &msg, len, 0);
	printf("returned value of msgsnd() is: %d\n", msgsnd_fd);
	if(msgsnd < 0){
		perror("msgsnd");
		exit(1);
	}
	
	/*read message queue*/
	msgrcv_fd = msgrcv(qid, &msg, BUFSIZ, 0, 0);
	printf("returned value of msgrcv() is: %d\n", msgrcv_fd);
	if(msgrcv_fd < 0){
		perror("msgrcv");
		exit(1);
	}
	printf("message is: %s", (&msg)->msg_text);

	/*delete message queue*/
	msgctl_fd = msgctl(qid, IPC_RMID, NULL);
	printf("returned value of msgctl() is: %d\n", msgctl_fd);
	if(msgctl_fd < 0){
		perror("msgctl");
		exit(1);
	}
	exit(0);	
}

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