#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;
}