根据不同的宏定义,在Makefile中添加不同的编译对象,可以添加更多的人 先执行lucy 源程序 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<sys/ipc.h> #include<sys/msg.h> #define KEYPATH "." #define PROJECT_ID 10 #ifdef LUCY char *sender = "lucy"; #define M 'L' #endif #ifdef PETER char *sender = "peter"; #define M 'P' #endif #ifdef LILEI char *sender = "lilei"; #define M 'I' #endif struct msg { long int mtype;//必须放在第一个成员上 char name[10]; char mtext[100]; }; int main(int argc,char *argv[]) { int msgpid; key_t key; pid_t pid; char buf[100]; struct msg msgs,msgr; key = ftok(KEYPATH,PROJECT_ID); if((msgpid=msgget(key,IPC_CREAT|0666)) < 0)//第一次创建消息队列必须加上IPC_CREAT,不然下边读的时候就会阻塞,key { perror("msgget"); exit(1); } pid = fork(); if(pid < 0) { perror("fork"); exit(1); } else if(pid == 0) { while(1) { printf("/r%s:",sender); memset(msgs.mtext,0,sizeof(msgs.mtext)); fgets(buf, 100, stdin); buf[strlen(buf)-1]='/0';//?strcy() msgs.mtype =(long int)buf[0];//消息类型直接赋值 strcpy(msgs.name, sender); strcpy(msgs.mtext,buf+2);//直到'/0'结束 msgsnd(msgpid,&msgs,110,0); } } else { while(1) { msgrcv(msgpid,&msgr,sizeof(msgr),(long int)(M),0);//只接受M类型的消息 printf("/rfrom %s msg:%s/n" , msgr.name,msgr.mtext); printf("%s:",sender);//重新打印提示符 fflush(stdout);//因为是行缓冲,所以要更新缓冲区,让其输出到标准输出 } } return 0; } Makefile all:lucy.c gcc lucy.c -o lucy -DLUCY gcc lucy.c -o peter -DPETER gcc lucy.c -o lilei -DLILEI clean: rm lucy peter lilei -f