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

//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 200

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, 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;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值