第一题
发送端
#include <myhead.h>
struct msgbuf
{
long mtype;
char mtext[1000];
};
int main(int argc, const char *argv[])
{
key_t key = ftok("./",'B');//创建key值
if(key==-1)
{
perror("ftok");
return -1;
}
int msgID = msgget(key,IPC_CREAT|0664);//利用key值创建消息队列的id
if(msgID==-1)
{
perror("msgget");
return -1;
}
struct msgbuf send;
while(1)
{
printf("请输入消息的类型:");
scanf("%ld",&send.mtype);
getchar();
printf("请输入消息的内容:");
fgets(send.mtext,sizeof(send.mtext),stdin);
send.mtext[strlen(send.mtext)-1] = '\0';
msgsnd(msgID,&send,sizeof(send.mtext),0);//发送消息
if(strcmp(send.mtext,"quit")==0)
{
break;
}
}
if(msgctl(msgID,IPC_RMID,NULL)==-1)
{
printf("删除队列失败");
return -1;
}
return 0;
}
接收端
#include <myhead.h>
struct msgbuf
{
long mtype;
char mtext[1000];
};
int main(int argc, const char *argv[])
{
key_t key = ftok("./",'B');//创建key值
if(key==-1)
{
perror("ftok");
return -1;
}
int msgID = msgget(key,IPC_CREAT|0664);//利用key值创建消息队列的id
if(msgID==-1)
{
perror("msgget");
return -1;
}
struct msgbuf rcv;
while(1)
{
msgrcv(msgID,&rcv,sizeof(rcv.mtext),0,0);
printf("%s\n",rcv.mtext);
if(strcmp(rcv.mtext,"quit")==0)
{
break;
}
}
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);//获取内存段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("请输入共享内存的数据:");
fgets(shmADD,1024,stdin);
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;
}
接收端
#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);//获取内存段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\n")==0)
{
break;
}
}
if(shmdt(shmADD)==-1)
{
perror("shmdt");
return -1;
}
return 0;
}
第三题
发送端
#include <myhead.h>
struct msgbuf
{
long mtype;
char mtext[1000];
};
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("请输入消息的类型:");
scanf("%ld",&send.mtype);
getchar();
printf("请输入消息的内容:");
fgets(send.mtext,sizeof(send.mtext),stdin);
msgsnd(msgID,&send,sizeof(send.mtext),0);
if(strcmp(send.mtext,"quit\n")==0)
{
break;
}
}
}
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,sizeof(rcv.mtext),0,0);
printf("%s\n",rcv.mtext);
if(strcmp(rcv.mtext,"quit")==0)
{
break;
}
}
}
else
{
perror("fork");
return -1;
}
return 0;
}
接收端
#include <myhead.h>
struct msgbuf
{
long mtype;
char mtext[1000];
};
int main(int argc, const char *argv[])
{
pid_t pid = fork();
if(pid>0)//父进程
{
key_t key = ftok("./",'B');
if(key==-1)
{
perror("fork");
return -1;
}
int msgID = msgget(key,IPC_CREAT|0664);
if(msgID==-1)
{
perror("msgget");
return -1;
}
struct msgbuf send;
while(1)
{
printf("请输入消息的类型:");
scanf("%ld",&send.mtype);
getchar();
printf("请输入消息的内容:");
fgets(send.mtext,sizeof(send.mtext),stdin);
msgsnd(msgID,&send,sizeof(send.mtext),0);
if(strcmp(send.mtext,"quit\n")==0)
{
break;
}
}
}
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,sizeof(rcv.mtext),0,0);
printf("%s\n",rcv.mtext);
if(strcmp(rcv.mtext,"quit")==0)
{
break;
}
}
}
else
{
perror("fork");
return -1;
}
return 0;
}