Добрый день, я хотел бы попросить помощи в следующем вопросе.
Мне необходимо записать считанный файл(Массив чар) в общую память и считать его в другой программе.
Массив чар(текст), а точнее его размер заранее неизвестен.
Идея - передать в общую память целое число - объем памяти и сам массив.
В читающей программе - считать размер, выделить память под массив текста и считать его.
Пока смог написать следующее. Но даже переменную объема памяти считать не удается.
Как записать и считать массив я тоже догадаться не могу.
Что я делаю не так?
Если можно, я был бы очень признателен за помощь.
Программа записи
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;
} |
|