进程间通信--消息队列(msg)--实现自由通信

来源:互联网 发布:软件框架设计的艺术 编辑:程序博客网 时间:2024/06/05 03:40
//msg(消息队列)--是将消息按队列的方式组织成的链表#include"utili.h"#include<stdio.h>#include<unistd.h>#include<sys/ipc.h>#include<sys/shm.h>#include<sys/sem.h>#include<sys/msg.h>#include<string.h>#include<stdlib.h>//............ser.c#include"utili.h"#define SEND_TYPE 100#define RECV_TYPE 200typedef struct MsgType{    long msg_type;    char msg_buf[256];}MsgType;int main(){    key_t msg_key;    msg_key = ftok("mymsg",0xff);    if(msg_key == -1)    {        perror("ftok");        exit(1);    }    int msg_id = msgget(msg_key, IPC_CREAT|0755);    if(msg_id == -1)    {        perror("msgget");        exit(1);    }    MsgType msg;    pid_t pid1,pid2;    pid1=fork();        int status;    if(pid1 == -1)    {        printf("create fork error\n");        exit(1);    }        else if(pid1 == 0)    {        while(1)        {            msgrcv(msg_id, &msg, 256, RECV_TYPE, 0);            printf("Cli:>%s\n",msg.msg_buf);                           }    }    else if(pid1 > 0)    {        pid2 = fork();        if(pid2 == -1)        {            printf("create fork2 erroe\n");            exit(1);        }        if(pid2 == 0)        {            while(1)            {                printf("Ser:>");                scanf("%s",msg.msg_buf);                if(strcmp(msg.msg_buf,"quit") == 0)                {                    close(msg_id);                    break;                }                msg.msg_type = SEND_TYPE;                msgsnd(msg_id, &msg, strlen(msg.msg_buf)+1, 0);            }        }        else if(pid2>0)        {            wait(&status);        }    }    /* ---只能实现你一句我一句       MsgType msg;       while(1)       {       printf("Ser:>");       scanf("%s",msg.msg_buf);       msg.msg_type = SEND_TYPE;       msgsnd(msg_id, &msg, strlen(msg.msg_buf)+1, 0);       msgrcv(msg_id, &msg, 256, RECV_TYPE, 0);       printf("Cli:>%s\n",msg.msg_buf);       }       */    return 0;}#..............cli.c#include"utili.h"#define SEND_TYPE  200#define RECV_TYPE  100/*int  msgsnd(int msqid,const void *ptr,size_t length,int flag);  ID号   发送消息的指针    长度      访问标记  其中ptr是一个结构指针,模板如下:  */typedef struct MsgType{    long msg_type;    char msg_buf[256];}MsgType;int main(){    key_t msg_key;    msg_key = ftok("mymsg",0xff);    if(msg_key == -1)    {        perror("ftok");        exit(1);    }    int msg_id = msgget(msg_key, 0);    if(msg_id == -1)    {        perror("msgget");        exit(1);    }    MsgType msg;    pid_t pid1,pid2;    pid1=fork();        int status;    if(pid1 == -1)    {        printf("create fork error\n");        exit(1);    }        else   if(pid1 == 0)    {        while(1)        {            msgrcv(msg_id, &msg, 256, RECV_TYPE, 0);            printf("Ser:>%s\n",msg.msg_buf);        }    }    else if(pid1 >0)    {        pid2 = fork();        if(pid2 ==-1)        {            printf("create fork2 error\n");            exit(1);        }        else if(pid2 == 0)        {            while(1)            {                printf("Cli:>");                scanf("%s",msg.msg_buf);                if(strcmp(msg.msg_buf,"quit") == 0)                {                    close(msg_id);                    break;                }                msg.msg_type = SEND_TYPE;                msgsnd(msg_id, &msg, strlen(msg.msg_buf)+1, 0);            }        }        else if(pid2>0)        {            wait(&status);        }        }        /*   while(1)             {             msgrcv(msg_id, &msg, 256, RECV_TYPE, 0);             printf("Ser:>%s\n",msg.msg_buf);             printf("Cli:>");             scanf("%s",msg.msg_buf);             msg.msg_type = SEND_TYPE;             msgsnd(msg_id, &msg, strlen(msg.msg_buf)+1, 0);             }             */        return 0;    }