在Linux中,进程间共享内存(Inter-Process Communication, IPC)是一种高效的通信方式
shmget
系统调用创建一个共享内存段。这个系统调用需要三个参数:键值(key)、共享内存长度(size)和权限(permissions)。例如:#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
key_t key = ftok("/tmp/shmfile", 'R'); // 生成一个唯一的键值
int shmid = shmget(key, 1024, 0644 | IPC_CREAT); // 创建一个长度为1024字节的共享内存段
shmat
系统调用将数据附加到共享内存段。这个系统调用需要两个参数:共享内存标识符(shmid)和附加地址(address)。例如:char *data = (char *)shmat(shmid, (void *)0, 0);
if (data == (char *)(-1)) {
perror("shmat");
exit(1);
}
strcpy(data, "Hello, world!");
char buffer[1024];
strcpy(buffer, data);
printf("Received: %s\n", buffer);
shmdt
系统调用将其从共享内存段分离。例如:if (shmdt(data) == -1) {
perror("shmdt");
exit(1);
}
shmctl
系统调用删除共享内存段。例如:if (shmctl(shmid, IPC_RMID, NULL) == -1) {
perror("shmctl");
exit(1);
}
注意:在使用共享内存时,需要注意同步和互斥问题,以避免数据竞争和不一致。可以使用信号量(semaphores)或互斥锁(mutexes)等同步机制来解决这个问题。