Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
4 / 4 / 1
Регистрация: 17.09.2013
Сообщений: 179
1

Запись данных в общую память и чтение

03.10.2016, 19:14. Показов 2213. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день, я хотел бы попросить помощи в следующем вопросе.
Мне необходимо записать считанный файл(Массив чар) в общую память и считать его в другой программе.
Массив чар(текст), а точнее его размер заранее неизвестен.

Идея - передать в общую память целое число - объем памяти и сам массив.
В читающей программе - считать размер, выделить память под массив текста и считать его.

Пока смог написать следующее. Но даже переменную объема памяти считать не удается.
Как записать и считать массив я тоже догадаться не могу.
Что я делаю не так?
Если можно, я был бы очень признателен за помощь.

Программа записи
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
 
int main()
{
    char pathname[] = "Lab4write.c"; 
   FILE * file;
   file = fopen("Lab4write.c","r");
    int *fsize;
   char *code;
    size_t n = 0;
    int c;
 
    if (file == NULL) return NULL; //could not open file
    fseek(file, 0, SEEK_END);
    long f_size = ftell(file);
    fseek(file, 0, SEEK_SET);
    code = malloc(f_size);
 
    while ((c = fgetc(file)) != EOF) {
        code[n++] = (char)c;    
    }
 
    code[n] = '\0';    
  //  printf("%s",code);
 
 
 // printf("size of array is %d fsize is %d",(int)sizeof(*code),(int)f_size);
 
 
 
 
    int *array;    /* Указатель на разделяемую память */
int *sharedMemoryArray; // массив в разделяемой области памяти
    int shmid;     /* IPC дескриптор для области 
разделяемой памяти */
    int new = 1;   /* Флаг необходимости инициализации 
элементов массива */
 
    key_t key;     /* IPC ключ */ 
 
 
    /* Генерируем IPC ключ из имени файла 06‐1a.c в 
        текущей директории и номера экземпляра области 
        разделяемой памяти 0 */
    if((key = ftok(pathname,0)) < 0){
        printf("Can\'t generate key\n");
    //    exit(‐1);
    }
//выделяем память.
    if((shmid = shmget(key, sizeof(int)+f_size,             
    0666|IPC_CREAT|IPC_EXCL)) < 0){
 
        if(errno != EEXIST){
            printf("Can\'t create shared memory\n");
           // exit(‐1);
        } else {
            if((shmid = shmget(key, f_size, 0)) < 0){
                printf("Can\'t find shared memory\n");
             //   exit(‐1);
            }
            new = 0;
        }
    }
 
    sharedMemoryArray  = (int *)shmat(shmid, NULL, 0);
    if(sharedMemoryArray < 0)
    {
        printf("Can't attach shared memory\n");
        //exit(‐1);
    }
    //сам массив   
    array = sharedMemoryArray + 1;
 
    if(new){
    printf("new file here \n");
      sharedMemoryArray = 5;
      printf("address is %p",&sharedMemoryArray);
 
    } 
 
 
  return 0;
 
 
 
}
Чтения
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <errno.h>
int main()
{
    int *array;   /* Указатель на разделяемую память */
    int shmid;    /* IPC дескриптор для области 
разделяемой памяти */
    int new = 1;  /* Флаг необходимости инициализации 
элементов массива */
    char pathname[] = "Lab4write.c"; /* Имя файла, 
        используемое для генерации ключа. Файл с таким 
        именем должен существовать в текущей директории 
*/
    key_t key;    /* IPC ключ */ 
    /* Генерируем IPC ключ из имени файла 06‐1a.c в 
    текущей директории и номера экземпляра области     разделяемой памяти 0 */
    if((key = ftok(pathname,0)) < 0){
        printf("Can\'t generate key\n");
       // exit(‐1);
    }
    /* Пытаемся эксклюзивно создать разделяемую память
    для сгенерированного ключа, т.е. если для этого 
    ключа она уже существует, системный вызов вернет
    отрицательное значение. Размер памяти определяем 
    как размер массива из трех целых переменных, права 
    доступа 0666 – чтение и запись разрешены для всех */
    if((shmid = shmget(key, 3*sizeof(int), 
        0666|IPC_CREAT|IPC_EXCL)) < 0){
    /* В случае возникновения ошибки пытаемся 
определить: возникла ли она из‐за того, что сегмент разделяемой 
    памяти уже существует или по другой причине */
        if(errno != EEXIST){
            printf("Can\'t create shared memory\n");
          //  exit(‐1);
        } else {
            if((shmid = shmget(key, 3*sizeof(int), 0)) < 0){      
            printf("Can\'t find shared memory\n");
               // exit(‐1);
            }
            new = 0;
        }
    }
    /* Пытаемся отобразить разделяемую память в адресное  
    пространство текущего процесса. Обратите внимание на 
то,
    что для правильного сравнения мы явно 
преобразовываем 
    значение ‐1 к указателю на целое.*/ 
    if((array = (int *)shmat(shmid, NULL, 0)) == 
        (int *)(-1)){
       
     //   exit(‐1);
    }
    /* В зависимости от значения флага new либо 
    инициализируем массив, либо увеличиваем 
    соответствующие счетчики */ 
    if(new){
    printf("Память была создана только что, поэтому все пустое/n");
    } else {
        printf(" shared memory arra is %d address is %p /n",array,&array);
    }
 
    if(shmdt(array) < 0){ 
        printf("Can't detach shared memory\n");
       // exit(‐1);
    }
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.10.2016, 19:14
Ответы с готовыми решениями:

Запись в память и чтение из нее
Значит есть программа-вольтметр, и при выходе напряжение за определенные приделы загорается...

Отображение файла на память (чтение и запись информации)
Короче нужно из одного файла переписать в другой используя отображение на память а у меня почему то...

Запись в память и чтение значений разных типов
Здравствуйте. Есть память, думал можно, а оказалось я в тупике, как покласть в память одно число...

MikroC. Запись-чтение байт во Flash память PIC18F452
Нашел вот такую функцию. void Flash_Write_Sector(long address, char *data) { unsigned short...

0
03.10.2016, 19:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.10.2016, 19:14
Помогаю со студенческими работами здесь

Чтение файла, чтение названия папки где находится файл, запись данных на PHP
Допустим у нас есть структура с папками типа Large -&gt; Vehicles -&gt; Firetruck_0 В этой папке лежит...

Open/Save Dialog. Сериализация данных. Запись/чтение данных объектов в/из потока.
Описана файловая переменная FileOfFilms: file of TFilmArr и переменная, содержащая имя файла...

Кодировка данных и запись их в память
в общем есть несколько классов, интерфейс (грубо говоря) мне нужно записать данные в массив байтов...

Запись данных в память программ PIC18LF46J50
Доброго времени суток! Такая проблема. Необходимо сохранять данные в энергонезависимую память...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru