给我一个Linux 共享内存 客户端 服务端的例子
时间: 2024-05-12 21:13:12 浏览: 95
好的,这里是一个简单的Linux共享内存客户端和服务端的示例代码:
服务端代码(server.c):
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
#define SHM_SIZE 1024 // 共享内存大小
#define SHM_FLAG 0666 // 共享内存权限
int main()
{
int shmid;
char *shm, *s;
// 创建共享内存
shmid = shmget(IPC_PRIVATE, SHM_SIZE, SHM_FLAG);
if (shmid == -1) {
perror("shmget failed");
exit(1);
}
// 将共享内存映射到进程地址空间
shm = shmat(shmid, NULL, 0);
if (shm == (char *) -1) {
perror("shmat failed");
exit(1);
}
// 写入数据到共享内存
printf("Server: Enter a message to write to shared memory: ");
fgets(s, SHM_SIZE, stdin);
strncpy(shm, s, SHM_SIZE);
// 等待客户端读取数据
while (*shm != '*')
sleep(1);
// 解除共享内存映射
if (shmdt(shm) == -1) {
perror("shmdt failed");
exit(1);
}
// 删除共享内存
if (shmctl(shmid, IPC_RMID, NULL) == -1) {
perror("shmctl failed");
exit(1);
}
return 0;
}
```
客户端代码(client.c):
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
#define SHM_SIZE 1024 // 共享内存大小
#define SHM_FLAG 0666 // 共享内存权限
int main()
{
int shmid;
char *shm, *s;
// 获取共享内存ID
shmid = shmget(IPC_PRIVATE, SHM_SIZE, SHM_FLAG);
if (shmid == -1) {
perror("shmget failed");
exit(1);
}
// 将共享内存映射到进程地址空间
shm = shmat(shmid, NULL, 0);
if (shm == (char *) -1) {
perror("shmat failed");
exit(1);
}
// 读取服务端写入的数据
printf("Client: Message read from shared memory: %s", shm);
// 将一个星号写入共享内存,表示数据已读取
*shm = '*';
// 解除共享内存映射
if (shmdt(shm) == -1) {
perror("shmdt failed");
exit(1);
}
return 0;
}
```
这个例子中,服务端创建了一个大小为1024字节的共享内存,将其映射到进程地址空间后,等待客户端写入数据。客户端先获取共享内存ID,将其映射到进程地址空间后,读取服务端写入的数据,并将一个星号写入共享内存,表示数据已读取。最后,客户端和服务端都解除了共享内存的映射。
阅读全文