Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / Организация работы с разделяемой памятью!!!! / 3 сообщений из 3, страница 1 из 1
27.03.2011, 17:31
    #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
30.03.2011, 16:23
    #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
25.04.2011, 22:36
    #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
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / Организация работы с разделяемой памятью!!!! / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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