在Ubuntu中,进程间共享内存(Inter-Process Communication, IPC)可以通过多种方式实现。以下是一些常用的方法:
shm_open()
, mmap()
, 和 munmap()
等系统调用实现。示例代码:
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#define SHM_SIZE 1024 // 共享内存大小
int main() {
int shm_fd;
void *ptr;
// 创建或打开共享内存对象
shm_fd = shm_open("/my_shm", O_CREAT | O_RDWR, 0666);
if (shm_fd == -1) {
perror("shm_open");
exit(1);
}
// 设置共享内存大小
if (ftruncate(shm_fd, SHM_SIZE) == -1) {
perror("ftruncate");
exit(1);
}
// 映射共享内存到进程地址空间
ptr = mmap(NULL, SHM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
if (ptr == MAP_FAILED) {
perror("mmap");
exit(1);
}
// 使用共享内存...
// 解除映射
if (munmap(ptr, SHM_SIZE) == -1) {
perror("munmap");
exit(1);
}
// 关闭共享内存对象
close(shm_fd);
// 删除共享内存对象(可选)
shm_unlink("/my_shm");
return 0;
}
shmget()
, shmat()
, 和 shmdt()
等系统调用。示例代码:
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>
#define SHM_SIZE 1024 // 共享内存大小
int main() {
int shm_id;
char *ptr;
// 创建或打开共享内存对象
shm_id = shmget(IPC_PRIVATE, SHM_SIZE, IPC_CREAT | 0666);
if (shm_id == -1) {
perror("shmget");
exit(1);
}
// 映射共享内存到进程地址空间
ptr = shmat(shm_id, NULL, 0);
if (ptr == (char *) -1) {
perror("shmat");
exit(1);
}
// 使用共享内存...
// 解除映射
if (shmdt(ptr) == -1) {
perror("shmdt");
exit(1);
}
// 删除共享内存对象(可选)
shmctl(shm_id, IPC_RMID, NULL);
return 0;
}
mmap()
系统调用实现。这种方法适用于需要在进程之间共享大量数据的情况。示例代码:
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#define FILE_SIZE 1024 // 文件大小
int main() {
int fd;
void *ptr;
// 创建文件
fd = open("my_file", O_RDWR | O_CREAT, 0666);
if (fd == -1) {
perror("open");
exit(1);
}
// 设置文件大小
if (ftruncate(fd, FILE_SIZE) == -1) {
perror("ftruncate");
exit(1);
}
// 映射文件到进程地址空间
ptr = mmap(NULL, FILE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (ptr == MAP_FAILED) {
perror("mmap");
exit(1);
}
// 使用共享内存...
// 解除映射
if (munmap(ptr, FILE_SIZE) == -1) {
perror("munmap");
exit(1);
}
// 关闭文件
close(fd);
return 0;
}
这些方法都可以实现在Ubuntu中的进程间共享内存。选择哪种方法取决于您的需求和应用场景。