使用进程、消息队列 实现 时间服务器,要求服务器进程发送时间信息到消息队列,客户端读取消息队列 获得时间信息。c语言程序实现,运行结果
时间: 2024-04-29 07:20:58 浏览: 86
以下是一个简单的时间服务器实现,使用进程和消息队列来进行通信:
服务器端代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <time.h>
#define MSG_KEY 1234
#define MSG_SIZE 64
struct message {
long type;
char text[MSG_SIZE];
};
int main() {
int msqid;
key_t key = MSG_KEY;
struct message msg;
time_t t;
// 创建消息队列
msqid = msgget(key, 0666 | IPC_CREAT);
if (msqid == -1) {
perror("msgget");
exit(1);
}
// 循环发送时间信息
while (1) {
// 获取当前时间
t = time(NULL);
snprintf(msg.text, MSG_SIZE, "%s", ctime(&t));
msg.type = 1;
// 发送消息
if (msgsnd(msqid, &msg, sizeof(msg.text), 0) == -1) {
perror("msgsnd");
exit(1);
}
sleep(1); // 每秒发送一次
}
return 0;
}
```
客户端代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define MSG_KEY 1234
#define MSG_SIZE 64
struct message {
long type;
char text[MSG_SIZE];
};
int main() {
int msqid;
key_t key = MSG_KEY;
struct message msg;
// 获取消息队列
msqid = msgget(key, 0666);
if (msqid == -1) {
perror("msgget");
exit(1);
}
// 循环读取消息
while (1) {
// 从消息队列中获取消息
if (msgrcv(msqid, &msg, sizeof(msg.text), 1, 0) == -1) {
perror("msgrcv");
exit(1);
}
// 输出时间信息
printf("Time: %s", msg.text);
}
return 0;
}
```
运行结果:
在两个终端窗口中分别编译并运行服务器端和客户端程序:
```
$ gcc server.c -o server
$ ./server
```
```
$ gcc client.c -o client
$ ./client
Time: Wed May 19 10:34:20 2021
Time: Wed May 19 10:34:21 2021
Time: Wed May 19 10:34:22 2021
...
```
可以看到,客户端程序每秒从消息队列中读取一次时间信息,并输出到终端中。
阅读全文