Загрузка данных


#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;
}