Загрузка данных
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#define SHM_SIZE 65536 // Размер разделяемой памяти (64KB)
#define PATHNAME "/tmp/shm_example_key"
#define PROJ_ID 1
int main() {
key_t key;
int shmid;
char *shared_memory;
FILE *source_file;
char source_code[SHM_SIZE];
size_t bytes_read;
// Генерируем ключ для разделяемой памяти
key = ftok(PATHNAME, PROJ_ID);
if (key == -1) {
perror("ftok");
exit(1);
}
// Создаём сегмент разделяемой памяти
shmid = shmget(key, SHM_SIZE, IPC_CREAT | IPC_EXCL | 0666);
if (shmid == -1) {
if (errno == EEXIST) {
// Сегмент уже существует, пытаемся получить доступ к нему
printf("Сегмент разделяемой памяти уже существует, подключаемся к нему...\n");
shmid = shmget(key, SHM_SIZE, 0666);
if (shmid == -1) {
perror("shmget");
exit(1);
}
} else {
perror("shmget");
exit(1);
}
} else {
printf("Создан новый сегмент разделяемой памяти с ID: %d\n", shmid);
}
// Подключаем разделяемую память к адресному пространству процесса
shared_memory = (char *)shmat(shmid, NULL, 0);
if (shared_memory == (char *)-1) {
perror("shmat");
exit(1);
}
// Открываем текущий исходный файл для чтения
source_file = fopen(__FILE__, "r");
if (source_file == NULL) {
perror("fopen");
shmdt(shared_memory);
exit(1);
}
// Читаем исходный код в буфер
bytes_read = fread(source_code, 1, SHM_SIZE - 1, source_file);
source_code[bytes_read] = '\0';
fclose(source_file);
// Копируем исходный код в разделяемую память
strcpy(shared_memory, source_code);
printf("Исходный код скопирован в разделяемую память.\n");
printf("Размер скопированного кода: %zu байт\n", bytes_read);
printf("Нажмите Enter для завершения программы (но разделяемая память останется)...\n");
getchar();
// Отключаем разделяемую память (но не удаляем её)
if (shmdt(shared_memory) == -1) {
perror("shmdt");
exit(1);
}
printf("Программа 1 завершена. Разделяемая память сохранена.\n");
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <errno.h>
#include <unistd.h>
#define SHM_SIZE 65536 // Должен совпадать с размером из первой программы
#define PATHNAME "/tmp/shm_example_key"
#define PROJ_ID 1
int main() {
key_t key;
int shmid;
char *shared_memory;
struct shmid_ds shm_info;
// Генерируем тот же ключ для доступа к разделяемой памяти
key = ftok(PATHNAME, PROJ_ID);
if (key == -1) {
perror("ftok");
exit(1);
}
// Получаем ID существующего сегмента разделяемой памяти
shmid = shmget(key, SHM_SIZE, 0666);
if (shmid == -1) {
perror("shmget");
printf("Возможно, разделяемая память ещё не создана. Запустите сначала программу 1.\n");
exit(1);
}
printf("Найден сегмент разделяемой памяти с ID: %d\n", shmid);
// Подключаем разделяемую память к адресному пространству процесса
shared_memory = (char *)shmat(shmid, NULL, 0);
if (shared_memory == (char *)-1) {
perror("shmat");
exit(1);
}
// Выводим содержимое разделяемой памяти (исходный код) на экран
printf("\n========== Содержимое разделяемой памяти ==========\n");
printf("%s\n", shared_memory);
printf("========== Конец содержимого ==========\n\n");
// Получаем информацию о сегменте
if (shmctl(shmid, IPC_STAT, &shm_info) == -1) {
perror("shmctl");
} else {
printf("Информация о сегменте:\n");
printf(" Размер: %ld байт\n", shm_info.shm_segsz);
printf(" Количество подключений: %ld\n", (long)shm_info.shm_nattch);
}
// Отключаем разделяемую память от текущего процесса
if (shmdt(shared_memory) == -1) {
perror("shmdt");
exit(1);
}
// Удаляем сегмент разделяемой памяти из системы
if (shmctl(shmid, IPC_RMID, NULL) == -1) {
perror("shmctl (IPC_RMID)");
exit(1);
}
printf("Сегмент разделяемой памяти успешно удалён из системы.\n");
return 0;
}