泄气了,继续冲!!!O(∩_∩)O
这篇文章只是为了 我整理思路 大家有不懂的可以评论,下方 我也是初学者,大家一起讨论。
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdbool.h>
#define PATH "."
#define SERVER 100 //服务器
#define CLIENT 101 //客户端
#define LEN 1024
#define STU_NAME 12
typedef struct Msg{
int msgtype;
char msgsz[LEN];
}Msg;
typedef struct Stu{
int no;
char name[STU_NAME];
int sex;
int height;
}Stu;
size_t get_msgsz(Msg *msg){
Stu *p = (Stu *)msg;
printf("请输入学号:\n");
scanf("%d",&p->no);
printf("请输入名字:\n");
scanf("%s",p->name);
printf("请输入性别(1-男 0-女):\n");
scanf("%d",&p->sex);
printf("请输入身高:\n");
scanf("%d",&p->height);
if(p->height <=170 ){
msg->msgtype = 1;
}else{
msg->msgtype = 2;
}
return sizeof(Stu);
}
typedef struct Class{
int class;
int classroom;
}Class;
void read_msg(Msg *msg){
Class *p = (Class *)msg;
printf("该学生为:\n");
printf("年级:%d\n",p->class);
printf("教室:%d\n",p->classroom);
}
int run(int msgid,int msgid1){
Msg msg = {};
size_t msgsz = get_msgsz(&msg);
int ret = msgsnd(msgid,&msg,msgsz,0);
if(ret == -1){
perror("msgsnd");
return -1;
}
ssize_t getsz = msgrcv(msgid1,&msg,LEN-1,0,0);
if(getsz == -1){
perror("msgrcv");
return -1;
}
read_msg(&msg);
}
int main(){
key_t key =ftok(PATH,SERVER);
key_t key1 =ftok(PATH,CLIENT);
if(key == -1 || key1 == -1){
perror("ftok");
return -1;
}
int msgid = msgget(key,IPC_CREAT|0644);
int msgid1 =msgget(key1,IPC_CREAT|0644);
if(msgid == -1 || msgid1 == -1){
perror("msgget");
return -1;
}
while(1){
run(msgid,msgid1);
/* Msg msg = {};
size_t msgsz = get_msgsz(&msg);
int ret = msgsnd(msgid,&msg,msgsz,0);
if(ret == -1){
perror("msgsnd");
return -1;
}
ssize_t getsz = msgrcv(msgid1,&msg,LEN-1,0,0);
if(getsz == -1){
perror("msgrcv");
return -1;
}
read_msg(&msg);*/
}
return 0;
}
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdbool.h>
#define PATH "."
#define SERVER 100 //服务器
#define CLIENT 101 //客户端
#define LEN 1024
#define STU_NAME 12
typedef struct Msg{
int msgtype;
char msgsz[LEN];
}Msg;
typedef struct Stu{
int no;
char name[STU_NAME];
int sex;
int height;
}Stu;
size_t get_msgsz(Msg *msg){
Stu *p = (Stu *)msg;
printf("请输入学号:\n");
scanf("%d",&p->no);
printf("请输入名字:\n");
scanf("%s",p->name);
printf("请输入性别(1-男 0-女):\n");
scanf("%d\n",&p->sex);
printf("请输入身高:\n");
scanf("%d",&p->height);
if(p->height >=170 ){
msg->msgtype = 1;
}else{
msg->msgtype = 2;
}
return sizeof(Stu);
}
typedef struct Class{
int class;
int classroom;
}Class;
void read_msg(Msg *msg){
Class *p = (Class *)msg;
printf("该学生为:\n");
printf("年级:%d\n",p->class);
printf("教室:%d\n",p->classroom);
}
size_t get_class(Msg *msg){
Class *p =(Class *)msg;
if(msg->msgtype == 1){
p->class = 3;
p->classroom =4;
}else{
p->class =7;
p->classroom = 8;
}
return sizeof(Class);
}
int run(int msgid,int msgid1){
Msg msg = {};
ssize_t getsz = msgrcv(msgid,&msg,LEN-1,0,0);
if(getsz == -1){
perror("msgrcv");
return -1;
}
size_t msgsz;
switch(msg.msgtype){
case 1:
msgsz = get_class(&msg);
msgsnd(msgid1,&msg,msgsz,0);
break;
case 2:
msgsz = get_class(&msg);
msgsnd(msgid1,&msg,msgsz,0);
break;
}
}
int main(){
key_t key =ftok(PATH,SERVER);
key_t key1 =ftok(PATH,CLIENT);
if(key == -1 || key1 == -1){
perror("ftok");
return -1;
}
int msgid = msgget(key,IPC_CREAT|0644);
int msgid1 =msgget(key1,IPC_CREAT|0644);
if(msgid == -1 || msgid1 == -1){
perror("msgget");
return -1;
}
while(1){
run(msgid,msgid1);
/* Msg msg = {};
ssize_t getsz = msgrcv(msgid,&msg,LEN-1,0,0);
if(getsz == -1){
perror("msgrcv");
return -1;
}
size_t msgsz;
switch(msg.msgtype){
case 1:
msgsz = get_class(&msg);
msgsnd(msgid1,&msg,msgsz,0);
break;
case 2:
msgsz = get_class(&msg);
msgsnd(msgid1,&msg,msgsz,0);
break;
}*/
}
/* size_t msgsz = get_msgsz(&msg);
int ret = msgsnd(msgid,&msg,get_msgsz,0);
if(ret == -1){
perror("msgsnd");
return -1;
}
ssize_t getsz = msgrcv(msgid1,&msg,LEN-1,0);
if(getsz == -1){
perror("msgrcv");
return -1;
}
read_msg(&msg);*/
return 0;
}