在Linux操作系统中,fork()
是一个系统调用,用于创建一个新的进程。新进程(子进程)几乎是父进程的一个完整副本,包括代码、数据、堆栈等。然而,在某些情况下,父进程和子进程可能需要共享某些资源,特别是内存资源。这就是所谓的“共享内存”。
问题:进程间数据不一致。 原因:多个进程同时读写同一块内存区域,可能导致竞态条件(Race Condition)。
问题:内存泄漏。 原因:进程忘记释放共享内存,导致资源耗尽。
#include <sys/ipc.h>
#include <sys/shm.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("/tmp", 'R');
int shmid = shmget(key, 1024, 0644 | IPC_CREAT);
char *str = (char*) shmat(shmid, (void*)0, 0);
int semid = semget(key, 1, 0644 | IPC_CREAT);
union semun arg;
arg.val = 1;
semctl(semid, 0, SETVAL, arg);
struct sembuf sb = {0, -1, SEM_UNDO};
semop(semid, &sb, 1); // 获取信号量
strcpy(str, "Hello, World!");
printf("Data written in memory: %s\n", str);
sb.sem_op = 1;
semop(semid, &sb, 1); // 释放信号量
shmdt(str);
return 0;
}
#include <fcntl.h>
#include <unistd.h>
#include <sys/shm.h>
#include <stdio.h>
int main() {
key_t key = ftok("/tmp", 'R');
int shmid = shmget(key, 1024, 0644 | IPC_CREAT);
char *str = (char*) shmat(shmid, (void*)0, 0);
int fd = open("/tmp/shared_memory.lock", O_RDWR | O_CREAT, 0644);
flock(fd, LOCK_EX); // 获取文件锁
strcpy(str, "Hello, World!");
printf("Data written in memory: %s\n", str);
flock(fd, LOCK_UN); // 释放文件锁
close(fd);
shmdt(str);
return 0;
}
通过合理使用信号量或文件锁,可以有效避免共享内存中的竞态条件和内存泄漏问题。在实际应用中,应根据具体需求选择合适的同步机制。
领取专属 10元无门槛券
手把手带您无忧上云