1> 使用消息队列完成两个进程之间相互通信
代码:
chat1.c:
#include<myhead.h>
//要发送的消息类型
struct msgbuf
{ long mtype; /* message type, must be > 0 */
char mtext[1024]; /* message data */
};
#define SIZE sizeof(struct msgbuf)-sizeof(long)
int main(int argc, const char *argv[])
{
//1、创建key值,用于生产消息队列
key_t key1 = ftok("/", 'k');
if(key1 == -1)
{
perror("ftok error");
return -1;
}
printf("key1 = %#x\n", key1);
key_t key2 = ftok("/", 't');
if(key2 == -1)
{
perror("ftok error");
return -1;
}
printf("key2 = %#x\n", key2);
//2、通过key值创建一个消息队列
int msqid1 = msgget(key1, IPC_CREAT|0664);
if(msqid1 == -1)
{
perror("msgget error");
return -1;
}
printf("msqid1 = %d\n", msqid1); //id号
int msqid2 = msgget(key2, IPC_CREAT|0664);
if(msqid2 == -1)
{
perror("msgget error");
return -1;
}
printf("msqid2 = %d\n", msqid2); //id号
//向消息队列中存放消息
struct msgbuf buf1;
struct msgbuf buf2;
// 创建进程
pid_t pid = fork();
if (pid > 0)
{
while (1)
{
printf("请输入消息类型:");
scanf("%ld", &buf1.mtype);
getchar(); // 吸收回车
printf("请输入消息正文:");
fgets(buf1.mtext, SIZE, stdin); // 从终端获取数据
buf1.mtext[strlen(buf1.mtext) - 1] = 0; // 将换行换成 '\0'
// 将消息发送到消息队列中
msgsnd(msqid1, &buf1, SIZE, 0);
printf("发送成功\n");
}
}else if(pid == 0)
{
msgrcv(msqid2, &buf2, SIZE, 0, 0);
printf("\n收到消息为:%s\n", buf2.mtext);
}else
{
perror("fork error");
return -1;
}
return 0;
}
chat2.c:
#include<myhead.h>
//要发送的消息类型
struct msgbuf
{ long mtype; /* message type, must be > 0 */
char mtext[1024]; /* message data */
};
#define SIZE sizeof(struct msgbuf)-sizeof(long)
int main(int argc, const char *argv[])
{
//1、创建key值,用于生产消息队列
key_t key1 = ftok("/", 'k');
if(key1 == -1)
{
perror("ftok error");
return -1;
}
printf("key1 = %#x\n", key1);
key_t key2 = ftok("/", 't');
if(key2 == -1)
{
perror("ftok error");
return -1;
}
printf("key2 = %#x\n", key2);
//2、通过key值创建一个消息队列
int msqid1 = msgget(key1, IPC_CREAT|0664);
if(msqid1 == -1)
{
perror("msgget error");
return -1;
}
printf("msqid1 = %d\n", msqid1); //id号
int msqid2 = msgget(key2, IPC_CREAT|0664);
if(msqid2 == -1)
{
perror("msgget error");
return -1;
}
printf("msqid2 = %d\n", msqid2); //id号
//向消息队列中存放消息
struct msgbuf buf1;
struct msgbuf buf2;
// 创建进程
pid_t pid = fork();
if (pid > 0)
{
while (1)
{
printf("请输入消息类型:");
scanf("%ld", &buf2.mtype);
getchar(); // 吸收回车
printf("请输入消息正文:");
fgets(buf2.mtext, SIZE, stdin); // 从终端获取数据
buf2.mtext[strlen(buf2.mtext) - 1] = 0; // 将换行换成 '\0'
// 将消息发送到消息队列中
msgsnd(msqid2, &buf2, SIZE, 0);
printf("发送成功\n");
}
}else if(pid == 0)
{
msgrcv(msqid1, &buf1, SIZE, 0, 0);
printf("\n收到消息为:%s\n", buf1.mtext);
}else
{
perror("fork error");
return -1;
}
return 0;
}
运行结果:
2> 将共享内存的实现重新敲一遍
代码:
send.c:
#include<myhead.h>
int main(int argc, const char *argv[])
{
//1、创建key值用于创建共享内存段
key_t key = ftok("/", 't');
if(key == -1)
{
perror("ftok error");
return -1;
}
printf("key = %d\n", key);
//2、创建一个共享内存的对象
int shmid = shmget(key, PAGE_SIZE, IPC_CREAT|0664);
if(shmid == -1)
{
perror("shmget error");
return -1;
}
printf("shmid = %d\n", shmid);
//3、将共享内存段映射到程序中来
char *addr = (char *)shmat(shmid, NULL, 0);
//参数1:共享内存的id号
//参数2:系统自动映射对齐页
//参数3:表示对共享内存的操作权限为读写权限
printf("addr = %p\n", addr); //输出映射的地址
//向共享内存中写入数据
strcpy(addr, "hello a hua qing yuan jian\n");
sleep(5);
//取消映射关系
if(shmdt(addr) ==-1)
{
perror("shmdt error");
return -1;
}
while(1);
return 0;
}
receive.c:
include<myhead.h>
int main(int argc, const char *argv[])
{
//1、创建key值用于创建共享内存段
key_t key = ftok("/", 't');
if(key == -1)
{
perror("ftok error");
return -1;
}
printf("key = %d\n", key);
//2、创建一个共享内存的对象
int shmid = shmget(key, PAGE_SIZE, IPC_CREAT|0664);
if(shmid == -1)
{
perror("shmget error");
return -1;
}
printf("shmid = %d\n", shmid);
//3、将共享内存段映射到程序中来
char *addr = (char *)shmat(shmid, NULL, 0);
//参数1:共享内存的id号
//参数2:系统自动映射对齐页
//参数3:表示对共享内存的操作权限为读写权限
printf("addr = %p\n", addr); //输出映射的地址
//读出共享内存中的数据
printf("消息为:%s", addr);
sleep(5);
if(shmdt(addr) == -1)
{
perror("shmdt error");
return -1;
}
//删除共享内存
if(shmctl(shmid, IPC_RMID, NULL) == -1)
{
perror("shmctl error");
return -1;
}
while(1);
return 0;
}
运行结果:
思维导图: