共享内存是一种进程间通信(IPC)机制,允许多个进程访问同一块物理内存区域。这种机制非常高效,因为数据不需要在进程之间复制,而是直接在内存中共享。
优势:
类型:
shmget
, shmat
, shmdt
, shmctl
等系统调用实现。shm_open
, mmap
, munmap
, shm_unlink
等函数实现。应用场景:
信号量是一种同步机制,用于控制多个进程对共享资源的访问。它本质上是一个计数器,用于记录可用资源的数量。
优势:
类型:
应用场景:
#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);
sprintf(str, "Hello, World!");
printf("Data written in memory: %s\n", str);
shmdt(str);
return 0;
}
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.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);
sprintf(str, "Hello, World!");
printf("Data written in memory: %s\n", str);
munmap(str, 1024);
close(shm_fd);
shm_unlink("/my_shm");
return 0;
}
#include <sys/ipc.h>
#include <sys/sem.h>
#include <stdio.h>
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
};
int main() {
key_t key = ftok("semfile", 65);
int semid = semget(key, 1, 0666|IPC_CREAT);
union semun arg;
arg.val = 1;
semctl(semid, 0, SETVAL, arg);
struct sembuf sb = {0, -1, SEM_UNDO};
semop(semid, &sb, 1);
printf("Critical Section\n");
sb.sem_op = 1;
semop(semid, &sb, 1);
return 0;
}
shmdt
和 shmctl
正确释放内存。通过合理使用共享内存和信号量,并结合适当的同步机制,可以有效解决多进程间的通信和资源共享问题。
领取专属 10元无门槛券
手把手带您无忧上云