作业
1、将消息队列发送接收端实现一遍。
send.c代码
#include <myhead.h>
struct msgbuf {
long mtype; /* 消息的类型*/
char mtext[1000]; /* 消息的正文,长度不是1,可以自定义*/
};
#define leng sizeof(struct msgbuf) - sizeof(long) //定义正文大小
int main(int argc, const char *argv[])
{
key_t key = ftok("./",'B');//创建key值
if(key==-1)
{
perror("ftok");
return -1;
}
printf("键:%#x\n",key);//key值
int msgID = msgget(key,IPC_CREAT|0664);//利用key值创建消息队列的id
if(msgID==-1)
{
perror("msgget");
return -1;
}
printf("msgid = %d\n",msgID);//输出消息队列id
struct msgbuf send;//定义结构体变量
while(1)
{
printf("请输入消息的类型:");
scanf("%ld",&send.mtype);
getchar();//吸收enter键
printf("亲输入消息的内容:");
fgets(send.mtext,sizeof(send.mtext),stdin);//键盘输入正文
send.mtext[strlen(send.mtext)-1] ='\0';
msgsnd(msgID,&send,leng,0);//leng消息正文大小,不包括类型
//0:表示阻塞发送
if(strcmp(send.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[1000]; /* 消息的正文,长度不是1,可以自定义*/
};
#define leng sizeof(struct msgbuf) - sizeof(long) //定义正文大小
int main(int argc, const char *argv[])
{
key_t key = ftok("./",'B');//创建key值
if(key==-1)
{
perror("ftok");
return -1;
}
printf("键:%#x\n",key);//key值
int msgID = msgget(key,IPC_CREAT|0664);//利用key值创建消息队列的id
if(msgID==-1)
{
perror("msgget");
return -1;
}
printf("msgid = %d\n",msgID);//输出消息队列id
struct msgbuf rcv;//定义结构体变量
while(1)
{
msgrcv(msgID,&rcv,leng,0,0);//第一个0:读取第一个消息不论类型
//第二个0,阻塞接收
printf("%s\n",rcv.mtext);
if(strcmp(rcv.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
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;
}
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\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]; /* 消息的正文,长度不是1,可以自定义*/
};
#define leng sizeof(struct msgbuf) - sizeof(long) //定义正文大小
int main(int argc, const char *argv[])
{
pid_t pid = fork();
if(pid>0)//父进程
{
key_t key1 = ftok("./",'B');//创建key值
if(key1==-1)
{
perror("ftok");
return -1;
}
printf("键:%#x\n",key1);//key值
int msgID1 = msgget(key1,IPC_CREAT|0664);//利用key值创建消息队列的id
if(msgID1==-1)
{
perror("msgget");
return -1;
}
printf("msgid = %d\n",msgID1);//输出消息队列id
struct msgbuf send;//定义结构体变量
while(1)
{
printf("请输入消息的类型:");
scanf("%ld",&send.mtype);
getchar();//吸收enter键
printf("请输入消息的内容:");
fgets(send.mtext,sizeof(send.mtext),stdin);//键盘输入正文
send.mtext[strlen(send.mtext)-1] ='\0';
msgsnd(msgID1,&send,leng,0);//leng消息正文大小,不包括类型
//0:表示阻塞发送
if(strcmp(send.mtext,"quit")==0)
{
break;
}
}
if(msgctl(msgID1,IPC_RMID,NULL)==-1)//删除消息队列
{
printf("删除队列失败\n");
return -1;
}
exit(EXIT_SUCCESS);
}
else if(pid==0)//子进程
{
key_t key2 = ftok("./",'W');//创建key值
if(key2==-1)
{
perror("ftok");
return -1;
}
printf("键:%#x\n",key2);//key值
int msgID2 = msgget(key2,IPC_CREAT|0664);//利用key值创建消息队列的id
if(msgID2==-1)
{
perror("msgget");
return -1;
}
printf("msgid = %d\n",msgID2);//输出消息队列id
struct msgbuf rcv;//定义结构体变量
while(1)
{
msgrcv(msgID2,&rcv,leng,0,0);//第一个0:读取第一个消息不论类型
//第二个0,阻塞接收
printf("%s\n",rcv.mtext);
if(strcmp(rcv.mtext,"quit")==0)
{
break;
}
}
exit(EXIT_SUCCESS);
}
else{
perror("fork");
return -1;
}
return 0;
}
rev.c代码
#include <myhead.h>
struct msgbuf {
long mtype; /* 消息的类型*/
char mtext[1000]; /* 消息的正文,长度不是1,可以自定义*/
};
#define leng sizeof(struct msgbuf) - sizeof(long) //定义正文大小
int main(int argc, const char *argv[])
{
pid_t pid = fork();
if(pid>0)//父进程
{
key_t key1 = ftok("./",'W');//创建key值
if(key1==-1)
{
perror("ftok");
return -1;
}
printf("键:%#x\n",key1);//key值
int msgID1 = msgget(key1,IPC_CREAT|0664);//利用key值创建消息队列的id
if(msgID1==-1)
{
perror("msgget");
return -1;
}
printf("msgid = %d\n",msgID1);//输出消息队列id
struct msgbuf send;//定义结构体变量
while(1)
{
printf("请输入消息的类型:");
scanf("%ld",&send.mtype);
getchar();//吸收enter键
printf("请输入消息的内容:");
fgets(send.mtext,sizeof(send.mtext),stdin);//键盘输入正文
send.mtext[strlen(send.mtext)-1] ='\0';
msgsnd(msgID1,&send,leng,0);//leng消息正文大小,不包括类型
//0:表示阻塞发送
if(strcmp(send.mtext,"quit")==0)
{
break;
}
}
if(msgctl(msgID1,IPC_RMID,NULL)==-1)//删除消息队列
{
printf("删除队列失败\n");
return -1;
}
exit(EXIT_SUCCESS);
}
else if(pid==0)//子进程
{
key_t key2 = ftok("./",'B');//创建key值
if(key2==-1)
{
perror("ftok");
return -1;
}
printf("键:%#x\n",key2);//key值
int msgID2 = msgget(key2,IPC_CREAT|0664);//利用key值创建消息队列的id
if(msgID2==-1)
{
perror("msgget");
return -1;
}
printf("msgid = %d\n",msgID2);//输出消息队列id
struct msgbuf rcv;//定义结构体变量
while(1)
{
msgrcv(msgID2,&rcv,leng,0,0);//第一个0:读取第一个消息不论类型
//第二个0,阻塞接收
printf("%s\n",rcv.mtext);
if(strcmp(rcv.mtext,"quit")==0)
{
break;
}
}
exit(EXIT_SUCCESS);
}
else{
perror("fork");
return -1;
}
return 0;
}
运行结果:
知识梳理