使用系统调用shmget( ),shmat( ),sgmdt( ),shmctl( ),编制一长度为1k的共享存储区的包含发送和接收的程序。
时间: 2024-12-10 11:32:43 浏览: 22
操作系统《02-基于共享存储区的进程间通信的设计》
3星 · 编辑精心推荐
在Linux系统中,使用`shmget()`、`shmat()`、`sgidt()`和`shmctl()`等函数可以创建、映射和管理共享内存区域(Shared Memory)。这里是一个简单的示例程序,它演示了如何创建一个长度为1K的共享内存,并在发送和接收数据的过程中使用它们:
```c
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SHM_SIZE 1024 // 定义共享内存大小
int main(int argc, char *argv[]) {
key_t key; // 共享内存键
int shmid; // 共享内存标识符
void *ptr; // 共享内存指针
size_t len;
int status;
// 获取键值
key = ftok("/tmp", 's'); // 使用文件路径和字符作为键
if (key == -1) {
perror("ftok failed");
return 1;
}
// 创建共享内存
shmid = shmget(key, SHM_SIZE, IPC_CREAT | 0666); // |0666设置权限
if (shmid == -1) {
perror("shmget failed");
return 1;
}
// 映射共享内存到进程地址空间
ptr = shmat(shmid, NULL, 0); // 第三个参数0表示替换原有内容
if (ptr == (void *)-1) {
perror("shmat failed");
shmctl(shmid, IPC_RMID, NULL); // 清理失败的共享内存
return 1;
}
// 将共享内存初始化为0或其他预设值
memset(ptr, '\0', SHM_SIZE);
// 发送数据
char send_data[] = "Hello from sender!";
memcpy(ptr, send_data, strlen(send_data) + 1); // 包含结束符'\0'
// 接收数据
len = strlen((char*)ptr);
printf("Received data: %.*s\n", len, (char*)ptr);
// 清理共享内存资源
shmdt(ptr); // 从进程地址空间移除映射
shmctl(shmid, IPC_RMID, NULL); // 删除共享内存
return 0;
}
```
这个程序首先获取了一个共享内存的关键字,然后创建并映射了一块1K的内存。发送端将字符串复制到共享内存中,接收端则读取并打印出来。最后,程序会释放共享内存。
阅读全文