user@netsprint:~/Desktop$ ./1.out
Создан новый сегмент разделяемой памяти с ID: 1
Исходный код скопирован в разделяемую память.
Размер скопированного кода: 3007 байт
Нажмите Enter для завершения программы (но разделяемая память останется)...
Программа 1 завершена. Разделяемая память сохранена.
user@netsprint:~/Desktop$ ./2.out
Найден сегмент разделяемой памяти с ID: 1
========== Содержимое разделяемой памяти ==========
#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;
}
========== Конец содержимого ==========
Информация о сегменте:
Размер: 65536 байт
Количество подключений: 1
Сегмент разделяемой памяти успешно удалён из системы.