匿名管道实现三种消息类型的通信

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
typedef enum Kind {KHello,KSchool,KName} Kind;
typedef struct Message{
  Kind kind;
  size_t size;
}Message, *PMessage;

typedef struct HelloMessage{
  Message base;    //base.kind = KHello
  char data[1];
}HelloMessage, *PHelloMessage;

typedef struct SchoolMessage{
  Message base;
  int       classroom_no;
}SchoolMessage, *PSchoolMessage;

typedef struct NameMessage{
	Message base;
	char name;
}NameMessage,*PNameMessage;

ssize_t sendSchoolMessage(int out,long classroom_no);
PSchoolMessage readSchoolMessage(int in, PMessage pm);

ssize_t sendHelloMessage(int out, char* hello_str);
PHelloMessage readHelloMessage(int in, PMessage pm);

ssize_t sendNameMessage(int out,char name);
PNameMessage readNameMessage(int in,PMessage pm);

int main(int argc, char** argv){

  int fd[2];
  int pipe_result;
  pipe_result = pipe(fd);
  if(pipe_result == -1){
    exit(errno);
  }

  pid_t child_pid;
  child_pid = fork();
  if(child_pid < 0){
    //创建子进程失败
      exit(errno);
  }else if(child_pid == 0){
    //进入子进程,并接受来自父进程的消息、解析并打印,随后退出
    close(fd[1]);

    int i;
    for(i = 0; i < 3; i++){
      PMessage pm = (PMessage)malloc(sizeof(Message));

      read(fd[0], pm, sizeof(Message));
      switch(pm->kind){
      case KHello:
        {
          PHelloMessage phm = readHelloMessage(fd[0],pm);
          printf("接收到来自父进程的问候:%s\n", phm->data);
        }
        break;
      case KSchool:
        {
          PSchoolMessage psm = readSchoolMessage(fd[0],pm);
          printf("房间号 := %d\n", psm->classroom_no);
        }
        break;
		case KName:
		{
			PNameMessage pnm = readNameMessage(fd[0],pm);
			printf("名字是:=%c\n",pnm->name);
		}

      }
    }

    _exit(0);
  }

  close(fd[0]);

  sendHelloMessage(fd[1], "Hello World!");
  sendSchoolMessage(fd[1],14514);
  sendNameMessage(fd[1],'C');

   return 0;
}

ssize_t sendSchoolMessage(int out,long classroom_no){
  PSchoolMessage psm = (PSchoolMessage) malloc(sizeof(SchoolMessage));
  psm->base.kind = KSchool;
  psm->base.size = sizeof(SchoolMessage);
  psm->classroom_no = classroom_no;
  return write(out, (char*) psm, psm->base.size);
}
PSchoolMessage readSchoolMessage(int in, PMessage pm){

  PSchoolMessage psm = (PSchoolMessage)malloc(sizeof(SchoolMessage));
  memcpy(psm, pm, sizeof(Message));
  read(in, (char*)psm + sizeof(Message), sizeof(SchoolMessage) - sizeof(Message));
  return psm;
}

ssize_t sendNameMessage(int out,char name){
	PNameMessage pnm = (PNameMessage)malloc(sizeof(NameMessage));
	pnm->base.kind =KName;
	pnm->base.size =sizeof(NameMessage);
	pnm->name = name;
	return write(out,(char*) pnm,pnm->base.size);
}
PNameMessage readNameMessage(int in,PMessage pm){
	
	PNameMessage pnm = (PNameMessage)malloc(sizeof(SchoolMessage));
	memcpy(pnm,pm,sizeof(Message));
	read(in,(char*)pnm + sizeof(Message),sizeof(NameMessage) - sizeof(Message));
	return pnm;
}

ssize_t sendHelloMessage(int out, char* hello_str){
  PHelloMessage phm = (PHelloMessage)malloc(sizeof(HelloMessage) + strlen(hello_str));
  phm->base.kind = KHello;
  phm->base.size = sizeof(HelloMessage) + strlen(hello_str);
  memcpy(phm->data, hello_str, strlen(hello_str) + 1);
  return write(out, (char*)phm, phm->base.size);
}

PHelloMessage  readHelloMessage(int in, PMessage pm){
  PHelloMessage phm = (PHelloMessage)malloc(pm->size);
  memcpy(phm, pm, sizeof(Message));
  read(in, phm->data, pm->size - sizeof(Message));
  return phm;
}




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值