作业
1> 使用消息队列完成两个进程之间相互通信
#include<myhead.h>
#define SIZE sizeof(struct msgbuf)-sizeof(long)
//要发送的消息类型
struct msgbuf
{
long mtype;
char mtext[1024];
};
int main(int argc,char *argv[])
{
//创建key值,用于生产消息队列
key_t key = ftok("/",'k');
if(key == -1)
{
perror("ftok error");
return -1;
}
printf("key = %#x\n",key);
//通过key值创建一个消息队列
int msqid = msgget(key,IPC_CREAT|0664);
if(msqid == -1)
{
perror("msgget error");
return -1;
}
printf("msqid = %d\n",msqid);
//向消息队列中存放消息
struct msgbuf buf;
pid_t pid = fork();
if(pid < 0)
{
perror("fork error");
return -1;
}else if(pid == 0)
{
while(1)
{
msgrcv(msqid,&buf,SIZE,1,0);
printf("收到消息为:%s\n",buf.mtext);
if(strcmp(buf.mtext,"quit") == 0)
{
break;
}
}
//删除消息队列
msgctl(msqid,IPC_RMID,NULL);
//退出进程
exit(EXIT_SUCCESS);
}else
{
while(1)
{
printf("请输入消息类型:");
scanf("%ld",&buf.mtype);
getchar(); //吸收回车
printf("请输入消息内容:");
fgets(buf.mtext,SIZE,stdin); //从终端获取数据
buf.mtext[strlen(buf.mtext)-1] = 0;
msgsnd(msqid,&buf,SIZE,0);
if(strcmp(buf.mtext,"quit") == 0)
{
buf.mtype = 1;
msgsnd(msqid,&buf,SIZE,0);
break;
}
printf("发送成功\n");
}
}
//回收子进程
wait(NULL);
return 0;
}
#define SIZE sizeof(struct msgbuf)-sizeof(long)
//要发送的消息类型
struct msgbuf
{
long mtype;
char mtext[1024];
};
int main(int argc,char *argv[])
{
//创建key值,用于生产消息队列
key_t key = ftok("/",'k');
if(key == -1)
{
perror("ftok error");
return -1;
}
printf("key = %#x\n",key);
//通过key值创建一个消息队列
int msqid = msgget(key,IPC_CREAT|0664);
if(msqid == -1)
{
perror("msgget error");
return -1;
}
printf("msqid = %d\n",msqid);
//向消息队列中存放消息
struct msgbuf buf;
pid_t pid = fork();
if(pid < 0)
{
perror("fork error");
return -1;
}else if(pid == 0)
{
while(1)
{
printf("请输入消息类型:");
scanf("%ld",&buf.mtype);
getchar(); //吸收回车
printf("请输入消息内容:");
fgets(buf.mtext,SIZE,stdin); //从终端获取数据
buf.mtext[strlen(buf.mtext)-1] = 0;
msgsnd(msqid,&buf,SIZE,0);
if(strcmp(buf.mtext,"quit") == 0)
{
buf.mtype = 2;
msgsnd(msqid,&buf,SIZE,0);
break;
}
printf("发送成功\n");
}
//删除消息队列
msgctl(msqid,IPC_RMID,NULL);
//退出进程
exit(EXIT_SUCCESS);
}else
{
while(1)
{
msgrcv(msqid,&buf,SIZE,2,0);
printf("收到消息为:%s\n",buf.mtext);
if(strcmp(buf.mtext,"quit") == 0)
{
break;
}
}
//删除消息队列
msgctl(msqid,IPC_RMID,NULL);
}
wait(NULL);
return 0;
}
2> 将共享内存的实现重新敲一遍
#include<myhead.h>
int main(int argc,const char *argv[])
{
key_t key = ftok("/",'t');
int shmid = shmget(key,PAGE_SIZE,IPC_CREAT|0664);
char *addr = (char *)shmat(shmid,NULL,0);
strcpy(addr,"hello a\n");
stmdt(addr);
while(1);
return 0;
}
#include<myhead.h>
#define SIZE 4096
int main(int argc,const char *argv[])
{
key_t key = ftok("/",'t');
int shmid = shmget(key,4096,IPC_CREAT|0664);
char *addr = (char *)shmat(shmid,NULL,0);
printf("addr = %s",addr);
while(1);
return 0;
}