1.将消息队列发送接收端实现一遍
//发送端代码
#include <myhead.h>
#define leng sizeof(struct msgbuf) - sizeof(long)
typedef struct msgbuf
{
long mtype;
char mtext[1000];
}stu;
int main(int argc, const char *argv[])
{
key_t key = ftok("./",'A');
if(key == -1)
{
perror("ftok");
return -1;
}
printf("key==%d\n",key);
int msgID = msgget(key,IPC_CREAT|0664);
printf("msgID=%d\n",msgID);
if(msgID == -1)
{
perror("msgget");
return -1;
}
stu st;
while(1)
{
printf("请输入消息的类型:");
scanf("%ld",&st.mtype);
getchar();
printf("请输入内容:");
fgets(st.mtext,sizeof(st.mtext),stdin);
st.mtext[strlen(st.mtext)-1] = '\0';
msgsnd(msgID,&st,leng,0);
if(strcmp(st.mtext,"quit") == 0)
{
break;
}
}
msgctl(msgID,IPC_RMID,NULL);
return 0;
}
//接收端代码
#include <myhead.h>
#define leng sizeof(struct msgbuf) - sizeof(long)
typedef struct msgbuf
{
long mtype;
char mtext[1000];
}stu;
int main(int argc, const char *argv[])
{
key_t key = ftok("./",'A');
if(key == -1)
{
perror("ftok");
return -1;
}
printf("key==%d\n",key);
int msgID = msgget(key,IPC_CREAT|0664);
printf("msgID=%d\n",msgID);
if(msgID == -1)
{
perror("msgget");
return -1;
}
char buff[1024];
stu st;
while(1)
{
msgrcv(msgID,&st,leng,0,0);
printf("%s\n",st.mtext);
if(strcmp(st.mtext,"quit") == 0)
{
break;
}
}
msgctl(msgID,IPC_RMID,NULL);
return 0;
}
2.将共享内存发送接收实现一遍
//发送端
#include <myhead.h>
#define MAX 4096
int main(int argc, const char *argv[])
{
key_t key = ftok("./",'A');
if(key == -1)
{
perror("ftok");
return -1;
}
int shmID = shmget(key,MAX,IPC_CREAT|0664);
if(shmID == -1)
{
perror("shmget");
return -1;
}
char *s = shmat(shmID,NULL,0);
if(s == (void*)-1)
{
perror("shmat");
return -1;
}
char buff[1024];
while(1)
{
fgets(buff,sizeof(buff),stdin);
strcpy(s,buff);
if(strcmp(buff,"quit\n")==0)
{
break;
}
}
shmdt(s);
if(shmctl(shmID,IPC_RMID,NULL)==-1)
{
perror("shmctl");
return -1;
}
return 0;
}
//接收端
#include <myhead.h>
#define MAX 4096
int main(int argc, const char *argv[])
{
key_t key = ftok("./",'A');
if(key == -1)
{
perror("ftok");
return -1;
}
int shmID = shmget(key,MAX,IPC_CREAT|0664);
if(shmID == -1)
{
perror("shmget");
return -1;
}
char *s = shmat(shmID,NULL,0);
if(s == (void*)-1)
{
perror("shmat");
return -1;
}
char buff[1024];
while(1)
{
sleep(1);
printf("%s\n",s);
if(strcmp(s,"quit\n")==0)
{
break;
}
}
shmdt(s);
return 0;
}
3.建立两个.c 建立子父进程,父进程发送消息到队列,子进程读取在队列消息
//1.c
#include <myhead.h>
#define leng sizeof(struct msgbuf)-sizeof(long)
typedef struct msgbuf
{
long mtype;
char mtext[1000];
}stu;
int main(int argc, const char *argv[])
{
pid_t pid = fork();
if(pid > 0)
{
key_t key = ftok("./",'A');
if(key == -1)
{
perror("ftok1");
return -1;
}
int msgID = msgget(key,IPC_CREAT|0664);
if(msgID == -1)
{
perror("msgget1");
return -1;
}
stu st;
while(1)
{
printf("请输入消息的类型:");
scanf("%ld",&st.mtype);
getchar();
printf("请输入消息的内容:");
fgets(st.mtext,sizeof(st.mtext),stdin);
st.mtext[strlen(st.mtext)-1] = '\0';
msgsnd(msgID,&st,leng,0);
if(strcmp(st.mtext,"quit") == 0)
{
break;
}
}
if(msgctl(msgID,IPC_RMID,NULL)==-1)
{
perror("msgctl");
return -1;
}
wait(NULL);
exit(0);
}
else if(pid == 0)
{
key_t key = ftok("./",'B');
if(key == -1)
{
perror("ftok2");
return -1;
}
int msgID = msgget(key,IPC_CREAT|0664);
if(msgID == -1)
{
perror("msgget2");
return -1;
}
stu st;
while(1)
{
msgrcv(msgID,&st,leng,0,0);
printf("%s\n",st.mtext);
if(strcmp(st.mtext,"quit")==0)
{
break;
}
}
exit(0);
}
else
{
perror("fork");
return -1;
}
return 0;
}
//2.c
#include <myhead.h>
#define leng sizeof(struct msgbuf)-sizeof(long)
typedef struct msgbuf
{
long mtype;
char mtext[1000];
}stu;
int main(int argc, const char *argv[])
{
pid_t pid = fork();
if(pid > 0)
{
key_t key = ftok("./",'B');
if(key == -1)
{
perror("ftok3");
return -1;
}
int msgID = msgget(key,IPC_CREAT|0664);
if(msgID == -1)
{
perror("msgget3");
return -1;
}
stu st;
while(1)
{
printf("请输入消息的类型:");
scanf("%ld",&st.mtype);
getchar();
printf("请输入消息的内容:");
fgets(st.mtext,sizeof(st.mtext),stdin);
st.mtext[strlen(st.mtext)-1] = '\0';
msgsnd(msgID,&st,leng,0);
if(strcmp(st.mtext,"quit") == 0)
{
break;
}
}
if(msgctl(msgID,IPC_RMID,NULL)==-1)
{
perror("msgctl");
return -1;
}
wait(NULL);
exit(0);
}
else if(pid == 0)
{
key_t key = ftok("./",'A');
if(key == -1)
{
perror("ftok4");
return -1;
}
int msgID = msgget(key,IPC_CREAT|0664);
if(msgID == -1)
{
perror("msgget4");
return -1;
}
stu st;
while(1)
{
msgrcv(msgID,&st,leng,0,0);
printf("%s\n",st.mtext);
if(strcmp(st.mtext,"quit")==0)
{
break;
}
}
exit(0);
}
else
{
perror("fork");
return -1;
}
return 0;
}