函數原型
#include <sys/msg/h>
int msgget (key_t key, int flag)
int msgctl (int msgid, int cmd , sruct msgid_ds *buf);
int msgsnd (int msgid, const void *ptr, size_t nbyes, long type, int flag);
int msgrcv (int msgid, void *ptr, size_t nbytes, long type, int flag);
文件msg為空文件,可以為任何內容,這里只是為了ftok函數使用。程序通過建立消息隊列,完成進程間通信,注意msgrcv的第四個參數為消息類型,他定義了從隊列中取消息的類型。
下面是msgLucy.c,是建立消息隊列的
#include<sys/ipc.h>
#include<sys/msg.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<stdio.h>
#include<fcntl.h>
#include<signal.h>
#include<stdlib.h>
#include<string.h>
#define PROJID 0xFF
#define LUCY 1
#define PETER 2
int mqid;
void terminate_handler(int signo)
{
?msgctl(mqid,IPC_RMID,NULL);
?exit(0);
}
int main()
{
?char filenm[] = "msg";
?key_t mqkey;
?struct msgbuf
?{
???? ?long mtype;???? ?/* message type, must be > 0 */
?? ?char mtext[256];? /* message data */
?? }msg;
?int ret;
?mqkey = ftok(filenm,PROJID);
?if(mqkey == -1)
?{
??perror("ftok error: ");
??exit(-1);
?}
?mqid = msgget(mqkey,IPC_CREAT | IPC_EXCL | 0666);
?if(mqid == -1)
?{
??perror("msgget error: ");
??exit(-1);
?}
?signal(SIGINT, terminate_handler);
?signal(SIGTERM, terminate_handler);
?while(1)
?{
??printf("Lucy: ");
??fgets(msg.mtext, 256, stdin);
??if (strncmp("quit", msg.mtext, 4) == 0)
??{
???msgctl(mqid,IPC_RMID,NULL);
???exit(0);
??}
??msg.mtext[strlen(msg.mtext)-1] = '\0';
??msg.mtype = LUCY;
??msgsnd(mqid,&msg,strlen(msg.mtext) + 1,0);
??msgrcv(mqid,&msg,256,PETER,0);
??printf("Peter: %s\n", msg.mtext);??
?}??
}
下面的是msgPeter,是和Lucy通信的,程序先運行Lucy,再運行Peter
#include<sys/ipc.h>
#include<sys/msg.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<stdio.h>
#include<fcntl.h>
#include<signal.h>
#include<string.h>
#include<stdlib.h>
#define PROJID 0xFF
#define LUCY 1
#define PETER 2
int main()
{
?char filenm[] = "msg";
?int mqid;
?key_t mqkey;
?struct msgbuf
?{
??????? ?long mtype;???? ?/* message type, must be > 0 */
???????? char mtext[256];? /* message data */
?? }msg;
?int ret;
?mqkey = ftok(filenm, PROJID);
?if(mqkey == -1)
?{
??perror("ftok error: ");
??exit(-1);
?}
?mqid = msgget(mqkey, 0);
?if(mqid == -1)
?{
??perror("msgget error: ");
??exit(-1);
?}
?while(1)
?{
??msgrcv(mqid,&msg,256,LUCY,0);
??printf("Lucy: %s\n",msg.mtext);
??printf("Peter: ");
??fgets(msg.mtext,256,stdin);
??if(strncmp("quit", msg.mtext, 4) == 0)
??{
???exit(0);
??}
??msg.mtext[strlen(msg.mtext)-1] = '\0';
??msg.mtype = PETER;
??msgsnd(mqid,&msg,strlen(msg.mtext) + 1,0);
?}?
}