共享内存是一种进程间通信(IPC)机制,允许多个进程访问同一块物理内存区域。这种机制提供了高效的通信方式,因为数据不需要在进程之间复制,而是直接在内存中共享。
Linux中常用的共享内存API包括:
shmget
, shmat
, shmdt
, shmctl
等函数实现。shm_open
, mmap
, munmap
, shm_unlink
等函数实现。写入进程:
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <string.h>
int main() {
key_t key = ftok("shmfile", 65);
int shmid = shmget(key, 1024, 0666|IPC_CREAT);
char *str = (char*) shmat(shmid, (void*)0, 0);
strcpy(str, "Hello, World!");
printf("Data written in memory: %s\n", str);
shmdt(str);
return 0;
}
读取进程:
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
int main() {
key_t key = ftok("shmfile", 65);
int shmid = shmget(key, 1024, 0666|IPC_CREAT);
char *str = (char*) shmat(shmid, (void*)0, 0);
printf("Data read from memory: %s\n", str);
shmdt(str);
shmctl(shmid, IPC_RMID, NULL);
return 0;
}
写入进程:
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#include <string.h>
int main() {
int shm_fd = shm_open("/my_shm", O_CREAT | O_RDWR, 0666);
ftruncate(shm_fd, 1024);
char *str = (char*) mmap(0, 1024, PROT_WRITE, MAP_SHARED, shm_fd, 0);
strcpy(str, "Hello, POSIX!");
printf("Data written in memory: %s\n", str);
munmap(str, 1024);
close(shm_fd);
shm_unlink("/my_shm");
return 0;
}
读取进程:
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
int main() {
int shm_fd = shm_open("/my_shm", O_RDONLY, 0666);
char *str = (char*) mmap(0, 1024, PROT_READ, MAP_SHARED, shm_fd, 0);
printf("Data read from memory: %s\n", str);
munmap(str, 1024);
close(shm_fd);
return 0;
}
chmod
或chown
命令修改权限。shmdt
(System V)或munmap
(POSIX)并使用shmctl
(System V)或shm_unlink
(POSIX)删除共享内存段。通过以上方法和示例代码,可以有效管理和使用Linux中的共享内存资源。
领取专属 10元无门槛券
手把手带您无忧上云