1、将消息队列发送接收端实现一遍。
代码展示
send.c
#include <myhead.h>
struct msgbuf{
long mtype;
char mtext[1024];
};
#define len sizeof(struct msgbuf)-sizeof(long)
int main(int argc, const char *argv[])
{
key_t key = ftok("./1.txt",'8');
if(key == -1){
perror("ftok");
return -1;
}
int msgid = msgget(key,IPC_CREAT|0664);
if(msgid==-1){
perror("msgget");
return -1;
}
struct msgbuf m;
while(1){
printf("请输入消息的类型:");
scanf("%ld",&m.mtype);
getchar();
printf("请输入消息的正文:");
fgets(m.mtext,sizeof(m.mtext),stdin);
m.mtext[strlen(m.mtext)-1] = '\0';
msgsnd(msgid,&m,len,0);
if(strcmp(m.mtext,"quit")==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[1024];
};
#define len sizeof(struct msgbuf)-sizeof(long)
int main(int argc, const char *argv[])
{
key_t key = ftok("./1.txt",'8');
if(key == -1){
perror("ftok");
return -1;
}
int msgid = msgget(key,IPC_CREAT|0664);
if(msgid==-1){
perror("msgget");
return -1;
}
struct msgbuf m;
while(1){
msgrcv(msgid,&m,len,0,0);
printf("%s\n",m.mtext);
if(strcmp(m.mtext,"quit")==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);//获取内存段的id
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);
buff[strlen(buff)-1] = '\0';
strcpy(shmAdd,buff);
if(strcmp(shmAdd,"quit")==0){
break;
}
}
if(shmdt(shmAdd)==-1){//取消当前进程共享内存段访问
perror("shmdt");
return -1;
}
if(shmctl(shmID,IPC_RMID,NULL)==-1){//删除共享内存段
perror("shmctl");
return -1;
}
return 0;
}
rev.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);//获取内存段的id
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")==0){
break;
}
}
if(shmdt(shmAdd)==-1){
perror("shmdt");
return -1;
}
return 0;
}
运行结果
3、建立两个.c 建立子父进程,父进程发送消息到队列,子进程读取队列,另一个同样。
代码展示
user1.c
不准确
#include <myhead.h>
struct msgbuf{
long mtype;
char mtext[1024];
};
#define len sizeof(struct msgbuf)-sizeof(long)
int main(int argc, const char *argv[])
{
int fk = fork();
if(fk > 0){
key_t key = ftok("./1.txt",'8');
if(key == -1){
perror("ftok");
return -1;
}
int msgid = msgget(key,IPC_CREAT|0664);
if(msgid == -1){
perror("msgget");
return -1;
}
struct msgbuf m;
while(1){
printf("请输入消息的类型:");
scanf("%ld",&m.mtype);
getchar();
printf("请输入消息的正文:");
fgets(m.mtext,sizeof(m.mtext),stdin);
m.mtext[strlen(m.mtext)-1] = '\0';
msgsnd(msgid,&m,len,0);
if(strcmp(m.mtext,"quit")==0){
break;
}
}
if(msgctl(msgid,IPC_RMID,NULL)==-1){
printf("删除队列失败\n");
return -1;
}
}else if(fk == 0){
key_t key = ftok("./2.txt",'8');
if(key == -1){
perror("ftok");
return -1;
}
int msgid = msgget(key,IPC_CREAT|0664);
if(msgid == -1){
perror("msgget");
return -1;
}
struct msgbuf r;
while(1){
msgrcv(msgid,&r,len,0,0);
if(strcmp(r.mtext,"quit")==0){
break;
}
printf("%s\n",r.mtext);
}
exit(EXIT_SUCCESS);
}else {
perror("fork");
return -1;
}
return 0;
}
user2.c
#include <myhead.h>
struct msgbuf{
long mtype;
char mtext[1024];
};
#define len sizeof(struct msgbuf)-sizeof(long)
int main(int argc, const char *argv[])
{
int fk = fork();
if(fk > 0){
key_t key = ftok("./2.txt",'8');
if(key == -1){
perror("ftok");
return -1;
}
int msgid = msgget(key,IPC_CREAT|0664);
if(msgid == -1){
perror("msgget");
return -1;
}
struct msgbuf m;
while(1){
printf("请输入消息的类型:");
scanf("%ld",&m.mtype);
getchar();
printf("请输入消息的正文:");
fgets(m.mtext,sizeof(m.mtext),stdin);
m.mtext[strlen(m.mtext)-1] = '\0';
msgsnd(msgid,&m,len,0);
if(strcmp(m.mtext,"quit")==0){
break;
}
}
if(msgctl(msgid,IPC_RMID,NULL)==-1){
printf("删除队列失败\n");
return -1;
}
}else if(fk == 0){
key_t key = ftok("./1.txt",'8');
if(key == -1){
perror("ftok");
return -1;
}
int msgid = msgget(key,IPC_CREAT|0664);
if(msgid == -1){
perror("msgget");
return -1;
}
struct msgbuf r;
while(1){
msgrcv(msgid,&r,len,0,0);
if(strcmp(r.mtext,"quit")==0){
break;
}
printf("%s\n",r.mtext);
}
exit(EXIT_SUCCESS);
}else {
perror("fork");
return -1;
}
return 0;
}