1、将消息队列发送接收端实现一遍。
send.c
#include <myhead.h>
struct msgbuf
{
long mtype;
char mtext[1000];
};
#define leng sizeof(struct msgbuf) - sizeof(long)
int main(int argc, const char *argv[])
{
/*
*/
key_t key = ftok("./",'B');
if(key == -1)
{
perror("ftok");
return -1;
}
printf("键:%#x\n",key);
int msgID = msgget(key,IPC_CREAT|0664);
if(msgID == -1)
{
perror("msgget");
return -1;
}
printf("msgid = %d\n",msgID);
struct msgbuf send;
while(1)
{
printf("请输入消息的类型:");
scanf("%ld",&send.mtype);
getchar();
printf("请输入消息的内容:");
fgets(send.mtext,sizeof(send.mtext),stdin);
msgsnd(msgID,&send,leng,0);
if(strcmp(send.mtext,"quit\n") == 0)
{
break;
}
}
if(msgctl(msgID,IPC_RMID,NULL) == -1)
{
printf("删除队列失败\n");
return -1;
}
return 0;
}
rev.c
#include <myhead.h>
struct msgbuf
{
long mtype;
char mtext[1000];
};
#define leng sizeof(struct msgbuf) - sizeof(long)
int main(int argc, const char *argv[])
{
/*
*/
key_t key = ftok("./",'B');
if(key == -1)
{
perror("ftok");
return -1;
}
printf("键:%#x\n",key);
int msgID = msgget(key,IPC_CREAT|0664);
if(msgID == -1)
{
perror("msgget");
return -1;
}
printf("msgid = %d\n",msgID);
struct msgbuf rcv;
while(1)
{
msgrcv(msgID,&rcv,leng,0,0);
printf("%s\n",rcv.mtext);
if(strcmp(rcv.mtext,"quit\n") == 0)
{
break;
}
}
return 0;
}
2、将共享内存发送接收实现一遍。
send.c
#include <myhead.h>
#define PAGE_SIZE 4096
int main(int argc, const char *argv[])
{
/*
*/
key_t key = ftok("./",'W');
if(key == -1)
{
perror("ftok");
return -1;
}
int shmID = shmget(key,PAGE_SIZE,IPC_CREAT|0664);
if(shmID == -1)
{
perror("shmget");
return -1;
}
char *shmADD = shmat(shmID,NULL,0);
if(shmADD == (void *)-1)
{
perror("shmat");
return -1;
}
char buff[1024];
while(1)
{
printf("请输入共享内存的数据:");
fgets(buff,sizeof(buff),stdin);
strcpy(shmADD,buff);
if(strcmp(shmADD,"quit\n") == 0)
{
break;
}
}
if(shmdt(shmADD) == -1)
{
perror("shmdt");
return -1;
}
if(shmctl(shmID,IPC_RMID,NULL) == -1)
{
perror("shmctl");
return -1;
}
return 0;
}
rcv.c
#include <myhead.h>
#define PAGE_SIZE 4096
int main(int argc, const char *argv[])
{
/*
*/
key_t key = ftok("./",'W');
if(key == -1)
{
perror("ftok");
return -1;
}
int shmID = shmget(key,PAGE_SIZE,IPC_CREAT|0664);
if(shmID == -1)
{
perror("shmget");
return -1;
}
char *shmADD = shmat(shmID,NULL,0);
if(shmADD == (void *)-1)
{
perror("shmat");
return -1;
}
while(1)
{
printf("%s\n",shmADD);
if(strcmp(shmADD,"quit\n") == 0)
{
break;
}
}
if(shmdt(shmADD) == -1)
{
perror("shmdt");
return -1;
}
return 0;
}
3、建立两个.c 建立子父进程,父进程发送消息到队列,子进程读取队列,另一个同样。
send.c
#include <myhead.h>
struct msgbuf
{
long mtype;
char mtext[1000];
};
#define leng sizeof(struct msgbuf) - sizeof(long)
int main(int argc, const char *argv[])
{
/*
*/
pid_t pid = fork();
if(pid > 0)
{
key_t key = ftok("./",'A');
if(key == -1)
{
perror("ftok");
return -1;
}
int msgID = msgget(key,IPC_CREAT|0664);
if(msgID == -1)
{
perror("msgget");
return -1;
}
struct msgbuf send;
while(1)
{
printf("请输入消息的类型:\n");
scanf("%ld",&send.mtype);
getchar();
printf("请输入消息的内容:\n");
fgets(send.mtext,sizeof(send.mtext),stdin);
msgsnd(msgID,&send,leng,0);
if(strcmp(send.mtext,"quit\n") == 0)
{
break;
}
}
if(msgctl(msgID,IPC_RMID,NULL) == -1)
{
printf("删除队列失败\n");
return -1;
}
wait(NULL);
exit(0);
}
else if(pid == 0)
{
key_t key = ftok("./",'B');
if(key == -1)
{
perror("ftok");
return -1;
}
int msgID = msgget(key,IPC_CREAT|0664);
if(msgID == -1)
{
perror("msgget");
return -1;
}
struct msgbuf rcv;
while(1)
{
msgrcv(msgID,&rcv,leng,0,0);
if(strcmp(rcv.mtext,"quit\n") == 0)
{
break;
}
printf("%s\n",rcv.mtext);
}
exit(0);
}
else
{
perror("fork");
return -1;
}
return 0;
}
rev.c
#include <myhead.h>
struct msgbuf
{
long mtype;
char mtext[1000];
};
#define leng sizeof(struct msgbuf) - sizeof(long)
int main(int argc, const char *argv[])
{
/*
*/
pid_t pid = fork();
if(pid > 0)
{
key_t key = ftok("./",'B');
if(key == -1)
{
perror("ftok");
return -1;
}
int msgID = msgget(key,IPC_CREAT|0664);
if(msgID == -1)
{
perror("msgget");
return -1;
}
struct msgbuf send;
while(1)
{
printf("请输入消息的类型:\n");
scanf("%ld",&send.mtype);
getchar();
printf("请输入消息的内容:\n");
fgets(send.mtext,sizeof(send.mtext),stdin);
msgsnd(msgID,&send,leng,0);
if(strcmp(send.mtext,"quit\n") == 0)
{
break;
}
}
if(msgctl(msgID,IPC_RMID,NULL) == -1)
{
printf("删除队列失败\n");
return -1;
}
wait(NULL);
exit(0);
}
else if(pid == 0)
{
key_t key = ftok("./",'A');
if(key == -1)
{
perror("ftok");
return -1;
}
int msgID = msgget(key,IPC_CREAT|0664);
if(msgID == -1)
{
perror("msgget");
return -1;
}
struct msgbuf rcv;
while(1)
{
msgrcv(msgID,&rcv,leng,0,0);
if(strcmp(rcv.mtext,"quit\n") == 0)
{
break;
}
printf("%s\n",rcv.mtext);
}
exit(0);
}
else
{
perror("fork");
return -1;
}
return 0;
}