linux,C语言,编写一段程序,使其用消息缓冲队列来实现 client 进程和 server 进程之间的通信server 进程先建立一个关键字为 SVKEY(如 75)的消息队列,然后等待接收类型为 REQ(如1)的消息;在收到请求消息后,它便显示字符串“serving for client”和接收到的 client进程的进程标识数,表示正在为 client 进程服务;然后再向 client 进程发送一应答消息,该消息的类型是 client进程的进程标识数,而正文则是 server 进程自己的标识数。client进程向消息队列发送类型为 REQ的消息(消息的正文为自己的进程标识数)以取得server进程的服务,并等待 server进程发来的应答;然后显示字符串“receive reply from”和接收到的server 进程的标识数。
时间: 2024-02-12 11:05:46 浏览: 153
linux下C语言编程(进程通信、消息队列)
4星 · 用户满意度95%
以下是实现该功能的代码:
server.c
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#define SVKEY 75
#define REQ 1
typedef struct {
long mtype;
int pid;
} msgbuf;
int main() {
int msqid;
msgbuf buf;
// 创建消息队列
if ((msqid = msgget(SVKEY, IPC_CREAT | 0666)) == -1) {
perror("msgget");
exit(1);
}
// 等待接收请求消息
if (msgrcv(msqid, &buf, sizeof(int), REQ, 0) == -1) {
perror("msgrcv");
exit(1);
}
// 显示服务信息
printf("serving for client %d\n", buf.pid);
// 发送应答消息
buf.mtype = buf.pid;
buf.pid = getpid();
if (msgsnd(msqid, &buf, sizeof(int), 0) == -1) {
perror("msgsnd");
exit(1);
}
return 0;
}
```
client.c
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#define SVKEY 75
#define REQ 1
typedef struct {
long mtype;
int pid;
} msgbuf;
int main() {
int msqid;
pid_t pid = getpid();
msgbuf buf;
// 创建消息队列
if ((msqid = msgget(SVKEY, 0)) == -1) {
perror("msgget");
exit(1);
}
// 发送请求消息
buf.mtype = REQ;
buf.pid = pid;
if (msgsnd(msqid, &buf, sizeof(int), 0) == -1) {
perror("msgsnd");
exit(1);
}
// 等待接收应答消息
if (msgrcv(msqid, &buf, sizeof(int), pid, 0) == -1) {
perror("msgrcv");
exit(1);
}
// 显示应答信息
printf("receive reply from server %d\n", buf.pid);
return 0;
}
```
编译并运行:
```
gcc -o server server.c
gcc -o client client.c
./server &
./client
```
输出结果:
```
serving for client 5954
receive reply from server 5953
```
阅读全文