/*send msg*/
#include <stdio.h> #include <errno.h> #include <string.h> #include <sys/ipc.h> #include <sys/msg.h> #include <sys/types.h> #define MAX_MSG_LENGTH 1024
//自己定义的消息格式
typedef struct msgbuf { long types; char texts[MAX_MSG_LENGTH]; }SYS_MSG; int main(int argc, char *argv[])
{ int msgid;
key_t key; int retval; SYS_MSG mybuf; //通过路径名联系两者之间的关系 if((key = ftok("/", 4)) < 0) { perror("ftok"); } if((msgid = msgget(key, IPC_CREAT|0777)) < 0)
{ perror("msgget"); } mybuf.types = 1;
strcpy(mybuf.texts, "hello world");
if((msgsnd(msgid, &mybuf, MAX_MSG_LENGTH, 0))) //发送消息类型为1的消息。
{ perror("msgsnd"); } mybuf.types = 2;
strcpy(mybuf.texts, "how are you");
if((msgsnd(msgid, &mybuf, MAX_MSG_LENGTH, 0))) //发送消息类型为2的消息。
{ perror("msgsnd"); } mybuf.types = 3;
strcpy(mybuf.texts, "i'm fine");
if((msgsnd(msgid, &mybuf, MAX_MSG_LENGTH, 0))) //发送消息类型为3的消息。 { perror("msgsnd"); } return 0; }
/*recv msg*/
#include <stdio.h> #include <errno.h> #include <stdlib.h> #include <string.h> #include <sys/ipc.h> #include <sys/msg.h> #include <sys/types.h> #define MAX_MSG_LENGTH 50
typedef struct msgbuf { long types; char texts[MAX_MSG_LENGTH]; }SYS_MSG; int main(int argc, char *argv[])
{ int msgid;
key_t key; int retval; SYS_MSG mybuf;
if((key = ftok("/", 4)) < 0)
{ perror("ftok"); } if((msgid = msgget(key, IPC_CREAT|0777)) < 0)
{ perror("msgget"); } while(1)
{ //输入想接收的消息类型 scanf("%ld", &mybuf.types); memset(mybuf.texts, 0, MAX_MSG_LENGTH); if(0 == mybuf.types) { break; } //接收消息类型为上面输入的消息类型 if(( msgrcv(msgid, &mybuf, MAX_MSG_LENGTH, mybuf.types, MSG_NOERROR)) < 0) { perror("msgrcv"); } printf("msgrcv : %s\n", mybuf.texts); } if(( msgctl(msgid, IPC_RMID, NULL)) < 0) //从内核中删除消息队列 { perror("msgctl"); } return 0; } |
|
来自: 昵称15757854 > 《unix 环境编程》