powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / Организация работы с разделяемой памятью!!!!
3 сообщений из 3, страница 1 из 1
Организация работы с разделяемой памятью!!!!
    #37184689
Crass_Mark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем Привет!! У меня такое задание- Нужно создать 2 программы, первая программа должна создавать сегмент разделяемой памяти и копировать туда собственный исходный текст, вторая программа должна брать оттуда этот текст, печатать его на экране и удалять сегмент разделяемой памяти из системы. Проблема собственно в том, что у меня никак не получается считать с помощью 2-й программы массив символов(ну то что я переслал с помощью 1-й программы) при этом, работая с числами(ну т.е. когда пересылаю массив чисел ) все работает нормально...

Вот исходник 1-й программы, вторая судя по всему примерно такая же...

Код: plaintext
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.
   
#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[] = "06-1a.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 {
            /* Если из-за того, что разделяемая память уже 
            существует, то пытаемся получить ее IPC 
            дескриптор и, в случае удачи, сбрасываем флаг 
            необходимости инициализации элементов массива */

            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)){
        printf("Can't attach shared memory\n");
        exit(- 1 );
    }
    /* В зависимости от значения флага new либо 
инициализируем массив, либо увеличиваем 
соответствующие счетчики */ 
    if(new){
        array[ 0 ] =  1 ;
        array[ 1 ] =  0 ;
        array[ 2 ] =  1 ;
    }
    return  0 ;
} 
...
Рейтинг: 0 / 0
Организация работы с разделяемой памятью!!!!
    #37190606
Crass_Mark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crass_MarkВсем Привет!! У меня такое задание- Нужно создать 2 программы, первая программа должна создавать сегмент разделяемой памяти и копировать туда собственный исходный текст, вторая программа должна брать оттуда этот текст, печатать его на экране и удалять сегмент разделяемой памяти из системы. Проблема собственно в том, что у меня никак не получается считать с помощью 2-й программы массив символов(ну то что я переслал с помощью 1-й программы) при этом, работая с числами(ну т.е. когда пересылаю массив чисел ) все работает нормально...

Вот исходник 1-й программы, вторая судя по всему примерно такая же...

Код: plaintext
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.
   
#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[] = "06-1a.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 {
            /* Если из-за того, что разделяемая память уже 
            существует, то пытаемся получить ее IPC 
            дескриптор и, в случае удачи, сбрасываем флаг 
            необходимости инициализации элементов массива */

            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)){
        printf("Can't attach shared memory\n");
        exit(- 1 );
    }
    /* В зависимости от значения флага new либо 
инициализируем массив, либо увеличиваем 
соответствующие счетчики */ 
    if(new){
        array[ 0 ] =  1 ;
        array[ 1 ] =  0 ;
        array[ 2 ] =  1 ;
    }
    return  0 ;
} 

уже разобрался
...
Рейтинг: 0 / 0
Организация работы с разделяемой памятью!!!!
    #37232752
пупс73
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите пожалуйста! Нужно 3 программы, первая записывает в разделяему память, вторая реверсирует эту строку а третья пооказывает строку. написала но передачи строки не осуществляется(

1 программа:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#include <string.h>

int main()
{
//int f;
//char s[100];
char *array;
int shmid;
int new = 1;
char pathname[] = "l54.c";
key_t key;
/* Генерируем IPC ключ из имени файла l54.c в
* текущей директории и номера
* экземпляра области разделяемой памяти 0 */

if((key = ftok(pathname,0)) < 0)
{
printf("Can't generate key\n");
exit(-1);
}
/* Пытаемся эксклюзивно создать разделяемую память для сгенерированного ключа, т
* .е. если для этого ключа она уже существует,
* системный вызов вернет отрицательное значение.
* Размер памяти определяем как размер массива из трех целых переменных, п
* рава доступа 0666 – чтение и запись разрешены для всех */
if ((shmid = shmget(key, sizeof(char[1000]), 0666|IPC_CREAT|IPC_EXCL)) < 0)
{
/* В случае ошибки пытаемся определить:
* возникла ли она из-за того,
* что сегмент разделяемой памяти уже существует
* или по другой причине */

if(errno != EEXIST)
{
/* Если по другой причине – прекращаем работу */
printf("Can't create shared memory\n");
exit(-1);
}
else
{
/* Если из-за того, что разделяемая память уже
существует, то пытаемся получить ее IPC
дескриптор и, в случае удачи, сбрасываем флаг
необходимости инициализации элементов массива */
if((shmid = shmget(key, sizeof(char[1000]), 0)) < 0)
{
printf("Can't find shared memory\n");
exit(-1);
}
new = 0;
}
}
array=shmat(shmid, NULL, 0);
/* if((int *)shmat(shmid, NULL, 0) == (int *)(-1))
{
printf("Can't attach shared memory\n");
exit(-1);
}*/


char mas[]="abcd";
int i= strlen(mas);
for (i=0; mas[i]!='\0'; i++)
{
printf(mas);
}



printf("\n Запись прошла успешно!\n");
if (shmdt(mas) < 0)
{
printf("Can't detach shared memory\n");
exit(-1);
}
return 0;
}
2 программаа:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#include <string.h>
void reverse(char s[])
{
int i, j;
char c;
for (i=0,j=strlen(s)-1;i<j;i++,j--)
{
c=s[i];
s[i]=s[j];
s[j]=c;
}
}
int main()
{
//int f;
//char s[10000];
char *array;
int shmid;
int new = 1;
char pathname[] = "l54.c";
key_t key;

/* Генерируем IPC ключ из имени файла l54.c в
* текущей директории и номера
* экземпляра области разделяемой памяти 0 */

if((key = ftok(pathname,0)) < 0)
{
printf("Can't generate key\n");
exit(-1);
}
/* Пытаемся эксклюзивно создать разделяемую память для сгенерированного ключа, т
* .е. если для этого ключа она уже существует,
* системный вызов вернет отрицательное значение.
* Размер памяти определяем как размер массива из трех целых переменных, п
* рава доступа 0666 – чтение и запись разрешены для всех */
if ((shmid = shmget(key, sizeof(char[10000]), 0666|IPC_CREAT|IPC_EXCL)) < 0)
{
/* В случае ошибки пытаемся определить:
* возникла ли она из-за того,
* что сегмент разделяемой памяти уже существует
* или по другой причине */

if(errno != EEXIST)
{
/* Если по другой причине – прекращаем работу */
printf("Can't create shared memory\n");
exit(-1);
}
else
{
/* Если из-за того, что разделяемая память уже
существует, то пытаемся получить ее IPC
дескриптор и, в случае удачи, сбрасываем флаг
необходимости инициализации элементов массива */
if((shmid = shmget(key, sizeof(char[10000]), 0)) < 0)
{
printf("Can't find shared memory\n");
exit(-1);
}
new = 0;
}
}
array=shmat(shmid, NULL, 0);
/* if((int *)shmat(shmid, NULL, 0) == (int *)(-1))
{
printf("Can't attach shared memory\n");
exit(-1);
}*/


/*char mas[]="abcd";
char mas2[]="oooo";
int i= strlen(mas);
int yy=0;
int uu=0;
//for (i=0; mas[i]!='\0'; i++)
//{
//mas2 = reverse(mas);
//printf(mas);
//mas2=mas;
strcpy(mas2,mas);
//}*/
char mas[]="qwerty";
/*int i= strlen(mas);
for (i=0; mas[i]!='\0'; i++)
{
printf(mas);
}*/
reverse(mas);
int i= strlen(mas);
for (i=0; mas[i]!='\0'; i++)
{
printf(mas);
}

printf("\n Запись прошла успешно!\n");
/*if (shmdt(mas) < 0)
{
printf("Can't detach shared memory\n");
exit(-1);
}*/
return 0;
}
3 программа:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#include <string.h>

int main()
{
char *array;
int shmid;
int new = 1;
char pathname[] = "l54.c";
key_t key;

/* Генерируем IPC ключ из имени файла l54.c в
* текущей директории и номера
* экземпляра области разделяемой памяти 0 */
if((key = ftok(pathname,0)) < 0)
{
printf("Can't generate key\n");
exit(-1);
}
/* Пытаемся эксклюзивно создать разделяемую память для сгенерированного ключа, т
* .е. если для этого ключа она уже существует,
* системный вызов вернет отрицательное значение.
* Размер памяти определяем как размер массива из трех целых переменных, п
* рава доступа 0666 – чтение и запись разрешены для всех */
if ((shmid = shmget(key, sizeof(char[10000]), 0666|IPC_CREAT|IPC_EXCL)) < 0)
{
/* В случае ошибки пытаемся определить:
* возникла ли она из-за того,
* что сегмент разделяемой памяти уже существует
* или по другой причине */

if(errno != EEXIST)
{
/* Если по другой причине – прекращаем работу */
printf("Can't create shared memory\n");
exit(-1);
}
else
{
/* Если из-за того, что разделяемая память уже
существует, то пытаемся получить ее IPC
дескриптор и, в случае удачи, сбрасываем флаг
необходимости инициализации элементов массива */
if((shmid = shmget(key, sizeof(char[10000]), 0)) < 0)
{
printf("Can't find shared memory\n");
exit(-1);
}
new = 0;
}
}
array=shmat(shmid, NULL, 0);
/* if((int *)shmat(shmid, NULL, 0) == (int *)(-1))
{
printf("Can't attach shared memory\n");
exit(-1);
}*/

/* f=open(pathname,O_RDONLY,0666);
read(f,s,10000);
close(f);*/

char mas[]="abcd";
int i= strlen(mas);
for (i=0; mas[i]!='\0'; i++)
{
printf(mas);
}


if (shmdt(mas) < 0)
{
printf("Can't detach shared memory\n");
exit(-1);
}
return 0;
}
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / Организация работы с разделяемой памятью!!!!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]