利用消息缓冲通信方式,可实现消息的发送与接收,编写发送进程sndfile.c将要发送的消息从键盘输入,每输入一行就作为一条消息发送,用end结束消息,编写接收进程rcvfile.c从消息队里逐个接收信息并显示,用end结束消息。
时间: 2024-02-23 19:59:55 浏览: 24
好的,我可以为您提供代码示例:
首先是发送进程sndfile.c:
```c
#include<stdio.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<string.h>
struct msgbuf
{
long msgtype;
char mtext[1024];
};
int main()
{
key_t key;
int msgid;
struct msgbuf msg;
key = ftok(".", 'a'); //生成key值
msgid = msgget(key, IPC_CREAT|0666); //创建消息队列
printf("Enter message to send:\n");
while(1)
{
fgets(msg.mtext, 1024, stdin); //从键盘输入消息
msg.msgtype = 1;
msgsnd(msgid, &msg, strlen(msg.mtext)+1, IPC_NOWAIT); //发送消息
if (strcmp(msg.mtext, "end\n") == 0) //如果输入end,则退出循环
break;
}
msgctl(msgid, IPC_RMID, NULL); //删除消息队列
return 0;
}
```
然后是接收进程rcvfile.c:
```c
#include<stdio.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<string.h>
struct msgbuf
{
long msgtype;
char mtext[1024];
};
int main()
{
key_t key;
int msgid;
struct msgbuf msg;
key = ftok(".", 'a'); //生成key值
msgid = msgget(key, IPC_CREAT|0666); //创建消息队列
printf("Received messages:\n");
while(1)
{
msgrcv(msgid, &msg, 1024, 1, IPC_NOWAIT); //接收消息
if (strcmp(msg.mtext, "end\n") == 0) //如果接收到end,则退出循环
break;
printf("%s", msg.mtext); //显示消息
}
msgctl(msgid, IPC_RMID, NULL); //删除消息队列
return 0;
}
```
注意需要在同一目录下编译并运行这两个程序。另外,由于使用了非阻塞式接收消息,因此在没有消息时程序可能会一直运行而不退出,可通过手动输入end来结束程序。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)